0

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 つの弾丸が当たった場合、右側の弾丸は次のフレームまで取り除かれません。

4

1 に答える 1