Pygame hängt sich bei while True: loop auf?
Hallo,
ich programmiere gerade ein Spiel in Pygame. Auf jeden Fall möchte ich den Ninja Wurfsternen (&anderen Waffen)Ammo geben, dass man eine bestimmte Anzahl von diesen hat und diese nicht spammen kann. Wenn man Space drückt, wird der Ammo Variable eins abgezogen und wenn der Ammo (heißt es der Ammo? ) höher als 0 ist, wird der Befehl self.shoot() ausgeführt. Jetzt mein Problem: Egal, welche Nummer die Variable hat (außer Null), kann ich einmal schießen und danach nicht mehr, auch wenn ich Space drücke. Ich weiß nur nicht wieso. Wenn ich es in einen while True, loop packe, hängt sich pygame auf. Nur wie kann ich das fixen, dass ich öfter als 1 Mal schießen kann. Hier mein benötigter Code (ohne den While True loop):
class Player(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.weapon = 'blowpipe'
self.shurikan = False
self.blowpipe = False
self.xp = PLAYER_XP
self.shoot_ammo = True
self.BLOWPIPE_AMMO = 5
self.SHURIKAN_AMMO = 5
def get_keys(self):
keys = pg.key.get_pressed()
if keys[pg.K_SPACE]:
if self.weapon == 'blowpipe' and self.shoot_ammo == True:
self.BLOWPIPE_AMMO -= 1
if self.BLOWPIPE_AMMO < 0:
self.BLOWPIPE_AMMO = 0
if self.BLOWPIPE_AMMO == 0:
self.shoot_ammo = False
if self.BLOWPIPE_AMMO > 0:
self.shoot()
if self.weapon == 'shurikan' and self.shoot_ammo == True:
self.SHURIKAN_AMMO -= 1
if self.SHURIKAN_AMMO < 0:
self.SHURIKAN_AMMO = 0
if self.SHURIKAN_AMMO == 0:
self.shoot_ammo = False
if self.SHURIKAN_AMMO > 0:
self.shoot()
def shoot(self):
if self.shoot_ammo == True:
now = pg.time.get_ticks()
if now - self.last_shot > WEAPONS[self.weapon]['rate']:
self.last_shot = now
dir = vec(1, 0).rotate(-self.rot)
EinegleicheListegibtesfürBlowpipe.
pos = self.pos + BARREL_OFFSET.rotate(-self.rot)
self.vel = vec(-WEAPONS[self.weapon]['rate'], 0).rotate(-self.rot)
for i in range(WEAPONS[self.weapon]['count']):
spread = uniform(-WEAPONS[self.weapon]['spread'], WEAPONS[self.weapon]['spread'])
Blowpipe(self.game, pos, dir.rotate(spread))
Außerdem gibt es eine Weapons Liste in einem anderen File:
WEAPONS['blowpipe'] = {'img': 'blowpipe.png',
'speed': 500,
'lifetime': 600,
'rate': 300,
'kickback': 0,
'spread': 5,
'damage': 3,
'size': 'blowpipe',
'count': 1}
Eine ähnliche Liste benutze ich für den Shurikan. Thx
2 Antworten
Hab mir deine Frage jetzt nicht durchgelesen, nur so viel: Endlosschleifen sind in keiner Programmiersprache eine gute Idee, und fast immer ein Zeichen für einen Designfehler.
Die berechtigten Einsatzgebiete kann man an einer halben Hand abzählen.
Sorge am besten immer für sinnvolle Abbruchbedingungen! Mit Endlosschleifen werden genau solche Fehler auftreten, wie von dir erwähnt.
danke für den Tipp. Aber das löst ja mein Hauptproblem nicht, das ich in der Frage erläutert habe. Hast du eine Idee, wie ich das zum laufen kriegen kann? Danke
(...) heißt es der Ammo? (...)
Verwende doch einfach verständliche, deutsche Begriffe.
Hier mein benötigter Code (...)
Die Syntax von Python erfordert bekanntermaßen eine korrekte Formatierung. Es macht daher keinen Sinn, sich deinen Snippet anzuschauen, denn dieser ist offensichtlich falsch eingerückt.
Wenn ich es in einen while True, loop packe, hängt sich pygame auf.
Das wird wohl daran liegen, dass bei Ausführung keine Abbruchbedingung greift. Irgendwann ist dann der Stack voll und das Programm hängt sich auf.
Ich denke, du dürftest dein Problem lösen können, indem du dir einen Debugger installierst und mit diesem einmal dein Programm analysierst. Lies dazu hier.
Du solltest natürlich nur den Bereich durchlaufen, in dem auch geschossen wird. Deine Breakpoints (mehrere sind möglich) kannst du frei verteilen.
Außerdem soll der Debugger dir keine Fehlermeldung liefern, sondern bei der Suche nach Logikfehlern helfen, da du durch ihn mit jedem Schritt durch den Code den Zustand aller Variablen zur Laufzeit sehen kannst. Genauso könntest du statische Fehleranalysen durchführen (bspw. im Kopf / mit Stift und Papier den Code durchgehen) oder mit Zwischenausgaben arbeiten.
Danke. Ich habe das Problem mittlerweile gelöst aber nochmals danke für die Erklärung des Debuggers.
Mein Code ist richtig formatiert, es sieht hier hat nicht so aus, weil es da beim copy und Pasten nach gutefrage.net irgendwie Probleme gab. Ach so, ja sorry ammo heißt Munition, mir ist der deutsche Begriff nicht eingefallen. Danke
und irgendwie bringt der Debugger nichts, da 1. es mehrere files sind die zusammen hängen (wenn ich nur main.py Debugge findet er den Fehler nicht) und 2. läuft das Programm, nur kann ich halt nur einmal schießen und danach nicht mehr obwohl ich meine Munition auf 5 gesetzt habe