Hilfe bei Pygame?
Sollte hilfe haben bei pygame ich bekomme nämlich eine Fehlermeldung :
local variable 'player_rect' referenced before assignment
Es handelt sich hierbei um eine Key input funktion was ich für meine Spielfigur machen will bekomme aber eben diese Fehlermeldung.Hier anbei der Code.
import pygame, os
pygame.init()
screen = pygame.display.set_mode((1920, 1080))
pygame.display.set_caption('Hallöle')
clock = pygame.time.Clock()
vel = 5
groeße = 0
background = pygame.image.load('background.png')
background = pygame.transform.scale(background, (1920,1080))
player = pygame.image.load('player.png')
player = pygame.transform.scale(player, (groeße+650, groeße+650) )
player_rect = player.get_rect(center = (286,538))
def player_movement():
key = pygame.key.get_pressed()
if key[pygame.K_a]:
player_rect -= vel
run = True
while run:
clock.tick(144)
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
player_movement()
screen.blit(background, (0, 0))
screen.blit(player, player_rect)
pygame.display.update()
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.
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.
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
funktioniert nun danke vielmals kann ich das auch mit den tasten wsd machen
also das er sich in alle vier richtungen bewegen kann
nein hat sich erledigt noch einmal danke
danke aber dann kommt diese fehlermeldung bei der betätigung der a taste:
unsupported operand type(s) for -=: 'pygame.Rect' and 'int'