Python でトップダウン シューティング ゲームをプログラミングしようとしていますが、弾丸の制御と削除に問題があります。要約すると、プレイヤーが操作する船のクラスと、プレイヤーが発砲したときに船が生成する弾丸のクラスがあります。弾丸は画面上で上向きに進み、再生ビューを終了すると削除されます。問題は、弾丸が取り除かれると、何かがうまくいかないことです。それが何であるかはわかりません(すべての弾丸の移動と削除を処理するのはforループだと思います)が、ゲームが弾丸を削除する必要がある場合のように、左側の弾丸でこの奇妙なずれが発生します(ちょうど単一フレームの場合) 画面の上部のすぐ下に左の弾丸を移動し、右の弾丸は影響を受けません。の
参考までに画像を載せておきます。
弾丸クラスは次のとおりです。
class Bullet():
def __init__(self, gun_pos):
self.image = pygame.image.load('Images/Bullet.png').convert()
self.rect = self.image.get_rect(midbottom = gun_pos)
play_surface.blit(self.image, self.rect)
def move(self):
self.rect.move_ip(0, -8)
def draw(self):
play_surface.blit(self.image, self.rect)
この部分は発射を処理します。プレイヤーが「発射」キーを押し、プレイヤーがリロードしていない場合、ゲームはプレイヤーの船の右上隅と左上隅に 2 つの弾丸を生成します。
if not player.reloading and firing:
bullet = Bullet(player.rect.topleft)
bullets.append(bullet)
bullet = Bullet(player.rect.topright)
bullets.append(bullet)
player.reloading = 4
以下は、弾丸の移動を処理し、弾丸がメイン サーフェスの上部を出たときにゲームから削除するメイン ループの部分です。
while running:
for bullet in bullets:
bullet.move()
if bullet.rect.bottom < 0:
bullets.remove(bullet)
continue
for ループを 2 つの for ループに分割し、1 つのループ処理で箇条書きを移動し、別のループ処理で箇条書きを削除する必要があるかどうかを確認した場合、ずれはありませんが、ループを束ねると問題が発生する理由に興味があります。
プレイヤーと敵を含むグラフィックスの描画を処理するコードの一部を次に示します。
pygame.draw.rect(play_surface, (0, 0, 0), SCREEN_RECT)
player.draw()
for enemy in enemies:
enemy.draw()
for bullet in bullets:
bullet.draw()
pygame.display.flip()
敵を実装しましたが、弾丸が敵に当たったときに同様の問題が発生しています。一度に 2 つの弾丸が当たった場合、右側の弾丸は次のフレームまで取り除かれません。