2016-05-15 5 views
0

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.

+1

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

+0

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? –

+0

Ja, aber dann spawnen Sie mehr Bälle, also wird die Liste nie leer, wenn sie der Ballgruppe hinzugefügt werden. – marienbad

Antwort

0

Das Problem ist folgendes, wie bereits in den Kommentaren darauf hingewiesen:

Sie nur, wenn der Ball in self.ball sollte gespeichert überprüfen entfernt werden. Wenn Sie der Liste mehr Bälle hinzufügen, prüfen Sie nie, ob diese ebenfalls entfernt werden müssen, da sie nicht in self.ball gespeichert sind.

Um es zu beheben, aktualisieren Sie Ihre Spiellogik in einer Schleife, in der Sie über jeden Ball in der Liste gehen.