Output Text in Pygame

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
StitZle
User
Beiträge: 7
Registriert: Dienstag 26. Juni 2018, 15:26

Guten Tag liebe Python Foren Mitglieder,

das hier ist mein erster Post hier, und ich hoffe ich mache alles richtig.

Zurzeit versuche ich mir etwas Python zu erlernen. Dazu möchte ich gerne ein Spiel Programmieren.
Das klappt auch ganz gut.
Das Spiel soll ein Text basierendes Spiel werden. Welches ohne viel Graphischen SchnickSchnack auskommt. Nun komme ich immer weiter in der Entwicklung,
jedoch merke ich zunehmend das es wohl besser wäre mit Pygame weiter zu arbeiten. Gerade weil ich den Text Output besser Formatieren und Darstellen möchte, z.B.: Zentriert.

Ich möchte gerne Text in Pygame ausgeben, wie in der Console:

Bild
Link zum Bild

Nun ich weiß wie man ein Wort in Pygame ausgeben kann, und auch wie man ein Schwarzes Fenster baut, jedoch scheitere ich dann schon wenn es darum geht mehrer Zeilen anzuzeigen.

Code: Alles auswählen

import pygame,time,

 
pygame.init()
 
pygame.display.set_caption('Test')
size = [640, 480]
screen = pygame.display.set_mode(size)
 

def text_typer(text) :
    font = pygame.font.SysFont("arial", 25)
    text = font.render(text, True, (255, 255, 255))

    textrect = text.get_rect()
    textrect.centerx = screen.get_rect().centerx
    textrect.centery = screen.get_rect().centery
    screen.fill((0, 0, 0))
    screen.blit(text, textrect)
 
    pygame.display.update() 
    time.sleep(1)


text_typer("Hello")
text_typer("Test")



 
 
So bekomme ich es hin mehrere Zeilen auszugeben, aber ich möchte ja das diese stehen bleiben. So wie in dem Bild oben.

Zudem wird in meinem Jetzigen "Programm" jeder Buchstabe eines Wortes einzeln nacheinander ausgegeben.
Sprich Hallo ---> H (0.03 sec pause) a (0.03 sec pause) l (0.03 sec pause) l (0.03 sec pause) o
Das habe ich versucht auch einzubauen bekomme es aber nicht hin.

Hier die Funktion dafür:

Code: Alles auswählen

import sys

def text_typer(string, delay) :
    for letter in string:
        sys.stdout.write(letter)
        sys.stdout.flush()
        time.sleep(delay)

text_typer ("Hallo", 0.03)

Vielleicht habt ihr da Ideen wie man so etwas richtig einbaut.

Ich freue mich auf eure Antworten :D

Niclas
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Überleg mal was die Zeile mit dem ``screen.fill((0, 0, 0))`` macht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
StitZle
User
Beiträge: 7
Registriert: Dienstag 26. Juni 2018, 15:26

__blackjack__ hat geschrieben: Dienstag 26. Juni 2018, 16:59 Überleg mal was die Zeile mit dem ``screen.fill((0, 0, 0))`` macht.
Danke, du hast recht. Aber jetzt wird der Text nur überschrieben.

Ist es überhaupt sinnvoll so ein Textbasiertes Spiel mit Pygame zu erstellen ?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Klar, Pygame hat neben der Möglichkeit Text darzustellen auch viele andere Funktionen.
Habe deinen Code mal etwas modifiziert.

Code: Alles auswählen

import pygame
import time

pygame.init()
pygame.display.set_caption('Test')
size = [640, 480]
screen = pygame.display.set_mode(size)

def draw_text(text):
    font = pygame.font.SysFont("arial", 25)
    y_pos = x_pos = 5
    for line in text.splitlines():
        for pos in range(1, len(line)+1):
            text = font.render(line[:pos], 1, (255, 255, 255))
            screen.blit(text, (x_pos, y_pos))
            pygame.display.update()
            time.sleep(0.1)
        y_pos += 25
        x_pos += 20

draw_text('Dies ist ein Text\nmit mehreren Zeilen\ndie auch eingerückt werden können.')
time.sleep(3)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
StitZle
User
Beiträge: 7
Registriert: Dienstag 26. Juni 2018, 15:26

ThomasL hat geschrieben: Dienstag 26. Juni 2018, 18:32 Klar, Pygame hat neben der Möglichkeit Text darzustellen auch viele andere Funktionen.
Habe deinen Code mal etwas modifiziert.

Code: Alles auswählen

import pygame
import time

pygame.init()
pygame.display.set_caption('Test')
size = [640, 480]
screen = pygame.display.set_mode(size)

def draw_text(text):
    font = pygame.font.SysFont("arial", 25)
    y_pos = x_pos = 5
    for line in text.splitlines():
        for pos in range(1, len(line)+1):
            text = font.render(line[:pos], 1, (255, 255, 255))
            screen.blit(text, (x_pos, y_pos))
            pygame.display.update()
            time.sleep(0.1)
        y_pos += 25
        x_pos += 20

draw_text('Dies ist ein Text\nmit mehreren Zeilen\ndie auch eingerückt werden können.')
time.sleep(3)

Danke. Das hat mir sehr geholfen.

Ich habe das time.sleep abgeändert, so kann man bestimmen wie lange jeder Text/ Buchstabe ausgeben werden soll.

Code: Alles auswählen

import pygame
import time

pygame.init()
pygame.display.set_caption('Test')
size = [640, 480]
screen = pygame.display.set_mode(size)

def draw_text(text, wait_time):
    font = pygame.font.SysFont("arial", 25)
    y_pos = x_pos = 5
    for line in text.splitlines():
        for pos in range(1, len(line)+1):
            text = font.render(line[:pos], 1, (255, 255, 255))
            screen.blit(text, (x_pos, y_pos))
            pygame.display.update()
            time.sleep(wait_time)
        y_pos += 25
        x_pos += 20

draw_text('Dies ist ein Beispiel Text\nZweite Zeile', 0.03)
time.sleep(3)
Antworten