Ich mache ein "Breakout" -Spiel und ich dachte, es würde Spaß machen, mit mehreren Bällen umgehen zu können. Dies ist die run_logic() Funktion in meinem Spiel Klasse:Pygame löscht die Liste nicht richtig
def run_logic(self):
if not self.game_over:
self.all_sprites_list.update()
if self.ball.y > SCREEN_HEIGHT:
self.ball_list.remove(self.ball)
self.all_sprites_list.remove(self.ball)
if len(self.ball_list) == 0:
self.game_over = True
bounce_balls = pygame.sprite.spritecollide(self.player, self.ball_list, False)
if len(bounce_balls) > 0:
for b in bounce_balls:
diff = (self.player.rect.x + self.player.width/2) - (b.rect.x + b.width/2)
b.rect.y = SCREEN_HEIGHT - 50 - b.rect.height
b.bounce(diff)
for ball in self.ball_list:
dead_blocks = pygame.sprite.spritecollide(ball, self.block_list, True)
if len(dead_blocks) > 0:
ball.bounce(0)
power1 = random.randrange(0, 10)
if power1 == 1:
self.ball = Ball(self.level)
self.ball_list.add(self.ball)
self.all_sprites_list.add(self.ball)
if len(self.block_list) == 0:
self.game_over = True
self.level += 1
Und hier ist die __init__()
Funktion, wenn es hilft:
def __init__(self):
self.game_over = False
self.block_list = pygame.sprite.Group()
self.ball_list = pygame.sprite.Group()
self.all_sprites_list = pygame.sprite.Group()
top = 40
block_height = 30
for row in range(4):
for column in range(0, 1): # 29
block = Block(BLOCK_COLOUR_LIST[self.level], column * 65 + 6, top)
self.block_list.add(block)
self.all_sprites_list.add(block)
top += block_height + 10
self.player = Player(self.level)
self.all_sprites_list.add(self.player)
self.ball = Ball(self.level)
self.ball_list.add(self.ball)
self.all_sprites_list.add(self.ball)
Es funktioniert gut, wenn es nur eine Kugel ist, wenn er trifft Der Boden, in dem das Spiel endet. Aber sobald mehrere Kugeln hervorgebracht werden (zufällig durch das Treffen der Blöcke), ist es egal, ob sie alle auf den Boden aufschlagen, ich kann immer noch nicht sterben. Ich konnte hier keine ähnliche Frage finden, und ich habe keine Ahnung, warum das nicht funktioniert, also würde ich mich über Hilfe freuen.
Sie fügen dasselbe Objekt (self.ball) mehrmals zu self.ball_list hinzu, aber entfernen es nur einmal, wenn der Ball den Boden erreicht. Dein verlorener Zustand wird nicht wahr sein. – Schore
Es tut mir leid, ich verstehe nicht. So möchte ich, dass es funktioniert: Ich habe zunächst einen Ball und füge ungefähr jeden zehnten Block einen hinzu. Immer wenn einer dieser Bälle den Boden berührt, entfernt das Spiel zuerst diesen Ball und prüft dann, ob es der letzte war (wenn die Liste leer war). Wenn es so war, ist das Spiel vorbei. Ist das nicht passiert? –
Ja, aber dann spawnen Sie mehr Bälle, also wird die Liste nie leer, wenn sie der Ballgruppe hinzugefügt werden. – marienbad