Python 以正确的顺序错误地移除精灵群敌人

Python 以正确的顺序错误地移除精灵群敌人,python,class,pygame,sprite,collision-detection,Python,Class,Pygame,Sprite,Collision Detection,我有两个精灵小组,一个给敌人,一个给玩家武器。一个我如何建立敌人精灵小组的例子。。。(武器精灵组也是这样做的) 当玩家的武器击中一只蝙蝠时,无论击中的是哪一只,5次击中后,第一只产生的蝙蝠被杀死。我不知道为什么会这样 看起来这就是问题所在: def update(self): if pygame.sprite.groupcollide(all_bats, all_sword, False, True): self.bat_health -= 1 groupcollid

我有两个精灵小组,一个给敌人,一个给玩家武器。一个我如何建立敌人精灵小组的例子。。。(武器精灵组也是这样做的)


当玩家的武器击中一只蝙蝠时,无论击中的是哪一只,5次击中后,第一只产生的蝙蝠被杀死。我不知道为什么会这样

看起来这就是问题所在:

def update(self):
    if pygame.sprite.groupcollide(all_bats, all_sword, False, True):
        self.bat_health -= 1 
groupcollide
返回冲突列表。上面的代码正在检查
所有的蝙蝠
所有的剑
,所以一切都是对一切的。而
if(非空列表)
总是返回
True

因此,如果发生任何蝙蝠+剑的碰撞,该精灵的生命值将降低。每次蝙蝠相撞时,这可能会降低每只蝙蝠的
自我。蝙蝠的健康状况。因此,创建的第一个项目将首先达到零

你需要检查“这个精灵”是否是碰撞的一部分。这是一个相当简单的变化:

def update(self):
    hit_list = pygame.sprite.groupcollide(all_bats, all_sword, False, True):
    if ( self in hit_list ):
        self.bat_health -= 1 
但是在每个bat的
update()
过程中,对每个bat执行
groupcollide
是没有效率的。也许可以将
groupcollide
调用移动到
.update()
函数之外的某个位置,然后只执行一次这些计算。将碰撞结果传递给精灵更新函数或类似函数

def update(self):
    hit_list = pygame.sprite.groupcollide(all_bats, all_sword, False, True):
    if ( self in hit_list ):
        self.bat_health -= 1