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)

这部分处理射击。如果玩家按下“开火”键并且玩家没有重新装弹,那么游戏会在玩家飞船的右上角和左上角产生两颗子弹。

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 循环分成两个 for 循环,一个循环处理移动子弹,另一个循环检查是否需要移除它们,则没有错位,但我很好奇为什么将循环捆绑在一起会导致问题。

下面是处理绘制图形的部分代码,包括玩家和敌人:

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()

我已经实现了一个敌人,当子弹击中敌人时我遇到了类似的问题。如果两颗子弹同时击中,那么右边的子弹直到下一帧才会被移除。

4

1 回答 1

0

你应该使用 pygame Sprites & Groups。

删除您的移动和绘制方法。

在你的子弹类中创建一个更新方法。

def update(self):
    self.rect.move_ip(0, -8)
    if self.rect.bottom < 0: self.kill()

为您的子弹制作一个精灵组,并将您的子弹添加到其中。

bulletGroup.update() 方法为每个子弹调用 update() 方法。

bulletGroup = pygame.sprite.Group()
bulletGroup.add(bullets)

while True:
    # do your stuff
    bulletGroup.update()
    # do your other stuff
    pygame.display.flip()
于 2013-10-28T08:30:13.317 回答