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

时间:2013-10-28 00:03:24

标签: object for-loop pygame

我正在尝试用Python编写一个自上而下的射击游戏,我在控制和移除子弹方面存在问题。总而言之,我有一个玩家控制的船只类和一个玩家发射时船只产生的子弹类。子弹在屏幕上向上推动,一旦它们退出播放视图,它们就会被移除。问题是,当子弹被移除时,出现问题。我不确定它是什么(我认为这是for循环,处理移动和删除所有子弹)但我得到这个奇怪的错误与左侧子弹,如游戏必须删除子弹,它跳过(只是对于单个框架而言,在右侧子弹保持不受影响的情况下移动屏幕顶部正下方的左侧子弹。

以下是image供参考。

这是子弹类:

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循环,其中一个循环处理移动子弹,另一个循环检查是否需要移除子弹,则没有错位,但我很好奇为什么将循环聚集在一起会导致问题。 / p>

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

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

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

1 个答案:

答案 0 :(得分:0)

你应该使用pygame Sprites&amp;基团。

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

在子弹类中制作更新方法。

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

为您的项目符号创建一个spritegroup,然后将项目符号添加到其中。

bulletGroup.update()方法为每个项目符号调用update()方法。

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

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