2016-05-15 3 views
0

私は「Breakout」スタイルのゲームを作っています。私は複数のボールを扱うことが楽しいと思っていました。これが私のゲームクラスのrun_logic()関数です:Pygameが正しく空にならない

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 

そして、ここでは、それは場合に役立ちます__init__()機能は、次のとおりです。それは当たったとき、ただ1つのボールがあるときには正常に動作します

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) 

ゲームが終了する地面。しかし、複数のボールが(ブロックを打つことによって無作為に)産み出されるとすぐに、それらのすべてが地面にぶつかるかどうかは関係ありません、私はまだ死ぬことはできません。前に投稿した類似の質問を見つけることができませんでした。なぜこれが機能しないのかわからないので、本当に助けていただければ幸いです。

self.ballに保存されたボールが除去されなければならない場合にのみチェック:既にコメントで指摘したように

+1

同じオブジェクト(self.ball)をself.ball_listに複数回追加しますが、ボールが一番下に当たった場合は一度だけ削除します。あなたの敗北状態は真実ではありません。 – Schore

+0

申し訳ありませんが、わかりません。これは私がそれが働く方法です:私は最初にボールが1つあり、私はヒットしたおよそ10ブロックごとに1つを追加します。これらのボールの1つが床に当たったとき、ゲームはまずそのボールを取り除き、最後にボールが空であるかどうかをチェックします。そうだったら、ゲームは終わった。これはワットではないですか? –

+0

はい、しかし、あなたはボールを追加しているので、リストが空になることはありません。 – marienbad

答えて

0

問題は、以下の通りです。リストにボールを追加すると、それも削除される必要があるかどうかは決して確認されません。ではなく、がself.ballに格納されています。

これを修正するには、ゲームのロジックをループで更新します。このロジックでは、リスト内のすべてのボールを移動します。

関連する問題