如何在pygame的while循环中只减少一个生命值?

How to reduce only a single life in a while loop in pygame?

所以基本上我正在制作一个游戏,如果玩家接触到敌人,玩家就会失去生命。我尝试通过以下方式做到这一点:

if player.rect.colliderect(enemy.rect):
    life -= 1

这段代码存在于while循环中,所以它的生命周期不断缩短。我只想让它减少一个生命。

如有任何帮助,我们将不胜感激。

谢谢

您应该包括整个 while 循环以获得正确答案。但通常要在特定条件下跳出循环,您可以使用 break 语句。像这样:

if player.rect.colliderect(enemy.rect):
    life -= 1
    break

我认为你的问题的根源在于 while 循环在发生单个“碰撞”时循环多次。在这种情况下,您可以考虑添加另一个属性,每次碰撞只允许减少一次生命。

给敌人增加一个属性class。对于这个例子,我们称之为 player_collided.

那么您的碰撞检查可以更新为:

while ...:
  ...

  if player.rect.colliderect(enemy.rect) and not enemy.player_collided:
    life -= 1
    enemy.player_collided = True
  else:
    enemy.player_collided = False

为你的“敌人”添加一个碰撞属性class:

class Enemy(pygame.sprite.Sprite):
    def __init__(self, ...):
        # [...]

        self.collide = False

执行以下逻辑:

  • 如果敌人与玩家发生碰撞并且 self.collide 已设置,什么也不做。

  • 如果敌人与玩家发生碰撞且未设置self.collide,则设置self.collide = True并递减life

  • 如果敌人没有与玩家发生碰撞,设置self.collide = False

while run:
    # [...]

    for enemy in enemies:

        if player.rect.colliderect(enemy.rect):
            
            # If an enemy collides with the player and `self.collide` is set, do nothing.
            if not self.collide:
                # If an enemy collides with the player and `self.collide` is not set, 
                # set `self.collide = True` and decrement `life`.
                self.collide = True
                life -= 1
                
        else:
            # If an enemy does not collide with the player, set `self.collide = False`.
            self.collide = False

这个逻辑意味着live只会在敌人第一次击中玩家时递减。敌人必须离开玩家区域才能再次计算碰撞。