Object Pygame中的自上而下射手--删除子弹会导致问题

Object Pygame中的自上而下射手--删除子弹会导致问题,object,for-loop,pygame,Object,For Loop,Pygame,我正在尝试用Python编写一个自上而下的射击游戏,我在控制和移除子弹方面遇到了问题。总而言之,我有一个类用于玩家控制的飞船,还有一个类用于玩家开火时飞船产生的子弹。子弹在屏幕上向上移动,一旦退出播放视图,子弹就会被移除。问题是,当子弹被取出时,会出现一些问题。我不确定它是什么(我认为是for循环处理移动和删除所有子弹),但我得到了与左侧子弹的这种奇怪的错位,比如当游戏必须删除子弹时,它跳过(仅为一帧)移动屏幕顶部下方的左子弹,而右子弹保持不变。 这里有一个参考资料 以下是bullet类: cl

我正在尝试用Python编写一个自上而下的射击游戏,我在控制和移除子弹方面遇到了问题。总而言之,我有一个类用于玩家控制的飞船,还有一个类用于玩家开火时飞船产生的子弹。子弹在屏幕上向上移动,一旦退出播放视图,子弹就会被移除。问题是,当子弹被取出时,会出现一些问题。我不确定它是什么(我认为是for循环处理移动和删除所有子弹),但我得到了与左侧子弹的这种奇怪的错位,比如当游戏必须删除子弹时,它跳过(仅为一帧)移动屏幕顶部下方的左子弹,而右子弹保持不变。

这里有一个参考资料

以下是bullet类:

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

我实施了一个敌人,当子弹击中敌人时,我也遇到了类似的问题。如果两颗子弹同时命中,则右侧的子弹在下一帧之前不会被移除。

您应该使用pygame Sprites&Groups

删除移动和绘制方法

在bullet类中创建更新方法

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

如果迭代一个副本,它可能会修复它<代码>用于项目符号中的项目符号[:]。可能是您在擦除时使迭代器无效。-另外,如果您使用的是Sprite和Sprite组,请参阅:迭代副本修复了该问题!非常感谢。我不使用Pygame的精灵和组的原因是,当我在计算它们时遇到问题,我的朋友告诉我,最终我最好使用常规列表来管理我的游戏对象。
def update(self):
    self.rect.move_ip(0, -8)
    if self.rect.bottom < 0: self.kill()
bulletGroup = pygame.sprite.Group()
bulletGroup.add(bullets)

while True:
    # do your stuff
    bulletGroup.update()
    # do your other stuff
    pygame.display.flip()