私は「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に保存されたボールが除去されなければならない場合にのみチェック:既にコメントで指摘したように
同じオブジェクト(self.ball)をself.ball_listに複数回追加しますが、ボールが一番下に当たった場合は一度だけ削除します。あなたの敗北状態は真実ではありません。 – Schore
申し訳ありませんが、わかりません。これは私がそれが働く方法です:私は最初にボールが1つあり、私はヒットしたおよそ10ブロックごとに1つを追加します。これらのボールの1つが床に当たったとき、ゲームはまずそのボールを取り除き、最後にボールが空であるかどうかをチェックします。そうだったら、ゲームは終わった。これはワットではないですか? –
はい、しかし、あなたはボールを追加しているので、リストが空になることはありません。 – marienbad