问题描述
所以基本上我正在制作一个游戏,如果玩家接触到敌人,玩家就会失去一条生命。我试着这样做:
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