我有一个定义的类,它代表一个字符列表,这个类中的方法很简单:
addCharacter(Character)
removeCharacter(Character)
addCharacters(Character, number)
removeCharacters(Character,number)
此类使用关联数组来追加和删除字符。他们都做他们想做的事。但是现在我已经到了碰撞阶段,我无法为像spritecollideany
这样的pygame给出的任何方法定义一个函数包装器。
当我尝试测试单个对象和charactersList之间是否存在冲突并尝试在发生冲突时删除该列表中的所有对象,而不是已经与之冲突的对象。
所以
troll = Characters()
monster = Characters()
monsters = CharactersList(monster)
monster.addCharacters(monster,3)
检查碰撞
if troll.collidesWith(monsters):
for mon in monsters:
mon.removeCharacter()
screen.remove_character(mon)
字符类中的碰撞函数如下所示:
from CharactersList import *
def collideswith(self,CharactersList):
collision = pygame.sprite.spritecollideany(self, CharactersList)
return collision
即使我用一个用于此
的精灵组替换关联数组self.sprites = pygame.sprite.Group(Character)
有关如何以这种方式与精灵组实现冲突的任何建议,以便当一个对象与该组中的一个碰撞时,只删除该对象?
非常感谢!
答案 0 :(得分:0)
这里有两个问题:
monsters
,同时迭代它;和troll
是否与mon
发生碰撞,但想要删除后者。最好检查每个mon
是否与troll
发生碰撞,存储要删除的怪物,然后将其全部删除:
if troll.collidesWith(monsters): # some monsters will need removing
removals = []
for mon in monsters: # figure out which
if mon.collidesWith(GroupSingle(troll)):
removals.append(mon)
for mon in removals: # remove them
mon.removeCharacter()
screen.remove_character(mon)
答案 1 :(得分:0)
正如@jonrsharpe所说,你不应该在迭代它时修改怪物列表 - 你可以复制它:
for mon in list(monsters):
if mon.collideswith([troll]):
mon.removeCharacter()
但是,尝试使用pygame.sprite.groupcollide()方法怎么样?
http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.groupcollide
# that would remove monsters that have collided with troll
groupcollide(troll, monsters, False, True)
如果您想使用该方法,请确保您的精灵对象具有rect值,如文档中所述。计算对象之间的碰撞是必需的。