Pygame Nutzerinteraktion

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Athene
User
Beiträge: 4
Registriert: Freitag 10. September 2021, 16:09

Hallo,

Ich programmieren jetzt noch nicht lange und habe entschieden mich an Pygame zu wagen. Ich habe auch eine gute Spielidee (die auch nicht zu komplex ist) und stehe vor einem Problem!

In der Hauptschleife habe ich Spielfiguren und Text hinzugefügt. Der Hintergrund ist weiß. Wenn der Spieler die Leertaste drückt, soll der Bildschirm zunächst schwarz werden. Dafür hab ich jetzt den Befehl

If event.type==pygame.KEYDOWN:
if event.key==pygame.K_SPACE:
screen.fill(SCHWARZ)

genutzt (Schwarz habe ich vorher definiert).

Allerdings passiert nichts wenn ich das Programm starte und auf die Leertaste drücke.

Kann mir einer sagen, woran das liegt? Für eine Antwort wäre ich sehr dankbar!
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Athene: Da muss ja mindestens noch ein `pygame.display.update()` oder `pygame.display.flip()` aufgerufen werden, damit die Anzeige aktualisiert wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Athene
User
Beiträge: 4
Registriert: Freitag 10. September 2021, 16:09

Das hab ich auch gemacht, es ändert sich trotzdem nichts.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Athene: Dann liegt das Problem irgendwo in Code den wir nicht kennen. Da kann man dann aber auch nicht wirklich was zu sagen, ausser, dass da dann halt irgendwo ein Fehler ist.

Zeig ein minimal lauffähiges Beispiel, dass das Problem hat. Dann kann man auch sagen was man da ändern muss.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Athene
User
Beiträge: 4
Registriert: Freitag 10. September 2021, 16:09

# Importieren der Pygame-Bibliothek
import pygame
from pygame.locals import *

# initialisieren von pygame
pygame.init()

#Variablen/KONSTANTEN setzen
W, H=800, 600

# Fenster öffnen
screen = pygame.display.set_mode((W, H))
pygame.display.set_caption("Histologie")
clock = pygame.time.Clock()
spielaktiv=True

# Schleife Hauptprogramm
while spielaktiv:
# Überprüfen, ob Nutzer eine Aktion durchgeführt hat
for event in pygame.event.get():
#Beenden
if event.type==pygame.QUIT:
spielaktiv=False
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_SPACE:
screen.fill(SCHWARZ)

# Spielfeld löschen
screen.fill(WEISS)

#Spielerbewegung

# Spielfeld/figuren zeichnen
screen.blit(spielerfigur,(100,700))
screen.blit(ziel,(2100,400))
screen.blit(text1, [450, 200])
screen.blit(text2, [480,280])
screen.blit(text3, [1100, 200])
screen.blit(text4, [1100, 280])
screen.blit(text5, [1750, 200])

# Fenster aktualisieren
pygame.display.update()
clock.tick(60)

pygame.quit()

Das ist der Hauptteil von dem Code. Die Texte dir gezeigt werden sollen und die Figuren habe ich vorher definiert und das hat auch alles funktioniert.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Athene: Naja, da wird mit Schwarz gefüllt, aber danach halt alles wieder mit Weiss.

Der Code der alles zeichnet sollte auch nicht *in* der Schleife stehen, die die Ereignisse abarbeitet, sondern danach.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Variablen-, oder in diesem Fall auch Konstantennamen sollten nicht kryptisch abgekürzt werden. Wenn man `WIDTH` meint, sollte man nicht nur `W` schreiben.

`spielaktiv` kann man sich sparen und einfach eine ”Endlosschleife” schreiben und wenn man das in eine Funktion steckt, kann man die mit ``return`` verlassen.

Man nummeriert keine Namen. Man will dann entweder bessere Namen verwenden, oder gar keine Einzelnamen sondern eine Datenstruktur. Oft eine Liste.

Ich denke auch, dass man hier die `Surface`-Objekte und die Koordinaten jeweils zu einem Objekt zusammenfassen möchte. Und bevor man sich da selbst einen Datentyp für schreibt, lohnt sich wahrscheinlich ein Blick in das `pygame.sprite`-Modul

Code: Alles auswählen

#!/usr/bin/env python3
import pygame

SCHWARZ = (0, 0, 0)
WEISS = (255, 255, 255)

SCREEN_SIZE = (800, 600)


def main():
    pygame.init()
    try:
        screen = pygame.display.set_mode(SCREEN_SIZE)
        pygame.display.set_caption("Histologie")
        clock = pygame.time.Clock()
        screen_color = WEISS
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE:
                        screen_color = SCHWARZ

            screen.fill(screen_color)

            screen.blit(spielerfigur, (100, 700))
            screen.blit(ziel, (2100, 400))
            #
            # FIXME Nummerierte Namen.
            #
            # TODO `pygame.sprite` verwenden‽
            #
            screen.blit(text1, (450, 200))
            screen.blit(text2, (480, 280))
            screen.blit(text3, (1100, 200))
            screen.blit(text4, (1100, 280))
            screen.blit(text5, (1750, 200))

            pygame.display.update()
            clock.tick(60)
    finally:
        pygame.quit()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Athene
User
Beiträge: 4
Registriert: Freitag 10. September 2021, 16:09

Vielen Dank schon mal, ich probiere das morgen mal in Ruhe aus, aber ich habe das Problem jetzt auch erkannt.
Antworten