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

问题描述

所以基本上我正在制作一个游戏,如果玩家接触到敌人,玩家就会失去一条生命。我试着这样做:

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

代码存在于while循环中,因此它不断减少寿命。我只是想让它把生命减一。

任何帮助将不胜感激。

谢谢

解决方法

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

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

向您的“敌人”类添加属性碰撞:

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 只有在敌人第一次击中玩家时才会递减。敌人必须离开玩家区域才能再次计算碰撞。

,

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

给敌人类添加一个属性。对于此示例,我们称其为 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