Hilfe bei Pygame?

1 Antwort

Die Fehlermeldung bezieht sich auf die Zeile die ich mit einem Kommentar markiert habe:

def player_movement():
    key = pygame.key.get_pressed()
    if key[pygame.K_a]:
        player_rect -= vel    #  hier steckt der Fehler!
        #  player_rect ist hier eine lokal vereinbarte
        #  Variable, der nie ein Wert zugewiesen wurde.

Das Problem ist, dass du die Variable player_rect als globale Variable verwenden möchtest. Unabhängig davon, dass globale Variablen von vielen Progrmmierern als schlechte Lösung angesehen werden, ist das durchaus möglich. Du musst dann in der Funktionsdefinition auch hinschreiben, dass player_rect eine globale Variable sein soll. Das geht so:

def player_movement():
    global  player_rect
    key = pygame.key.get_pressed()
    if key[pygame.K_a]:
        player_rect -= vel

Die 2. Zeile ist gegenüber deinem Code neu und sollte dein Problem beheben. Probiere das bitte mal aus.

Woher ich das weiß:Berufserfahrung – Berufstätigkeit als Software-Entwickler

Valentin2882 
Beitragsersteller
 26.10.2022, 21:48

danke aber dann kommt diese fehlermeldung bei der betätigung der a taste:

unsupported operand type(s) for -=: 'pygame.Rect' and 'int'

0
BorisG2011  26.10.2022, 21:56
@Valentin2882

Diese Fehlermeldung kommt zu Recht, du kannst von einem Rechteck keine ganze Zahl abziehen.

Ich vermute, dass du das Rechteck verschieben möchtest. Dafür gibt es in Pygame die Methode move, die den x-Wert der Verschiebung und den y-Wert der Verschiebung als Argumente verlangt.

Probiere bitte mal folgendes:

def player_movement():
    global  player_rect
    key = pygame.key.get_pressed()
    if key[pygame.K_a]:
        player_rect = player_rect.move(vel, 0)

Die letzte Zeile ist jetzt anders

Das sollte eine waagerechte Verschiebung um die Distanz vel bewirken. Wie weit du das Rechteck tatsächlich verschieben möchtest, weiß ich natürlich nicht, das überlegst du dir bitte selbst.

Die Beschreibung der Methode move findest du hier:

https://www.pygame.org/docs/ref/rect.html#pygame.Rect.move

Beachte,dass dort ausdrücklich steht, dass move ein neues Rechteck erzeugt. Deshalb musst du das neu erzeugte Rechteck an die globale Variable zuweisen. Das alte Rechteck geht dabei verloren.

1
BorisG2011  26.10.2022, 22:17
@BorisG2011

Nachtrag:

Ich sehe in der Pygame-Dokumentation gerade, dass es für Rechtecke auch eine Methode gibt, die die Verschiebung des Rechtecks ausführt, ohne dabei ein neues Rechterck zu erzeugen. Eine derartige Verschiebung wird im Jargon der Informatiker "in place" genannt und die Methode heißt folgerichtig auch move_ip.

Wenn du in-place-Verschiebung verwendest, ersparst du dir die erneute Zuweisung. Du kannst also - gleichwertig mit der oben gezeigten Lösung - schreiben:

def player_movement():
    global  player_rect
    key = pygame.key.get_pressed()
    if key[pygame.K_a]:
        player_rect.move_ip(vel, 0)
        #  Jetzt hat das Rechteck eine neue Position

Die Beschreibung von move_ip steht hier:

https://www.pygame.org/docs/ref/rect.html#pygame.Rect.move_ip

0
Valentin2882 
Beitragsersteller
 27.10.2022, 09:23
@BorisG2011

funktioniert nun danke vielmals kann ich das auch mit den tasten wsd machen

1