我正在尝试用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()
我实施了一个敌人,当子弹击中敌人时,我遇到了类似的问题。如果同时击中两颗子弹,那么右边的子弹将不会被移除,直到下一帧。
答案 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()