与精灵群体的碰撞

时间:2014-01-02 11:02:55

标签: python pygame sprite

我有一个定义的类,它代表一个字符列表,这个类中的方法很简单:

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) 

有关如何以这种方式与精灵组实现冲突的任何建议,以便当一个对象与该组中的一个碰撞时,只删除该对象?

非常感谢!

2 个答案:

答案 0 :(得分:0)

这里有两个问题:

  1. 您正在尝试修改monsters,同时迭代它;和
  2. 您正在检查troll是否与mon发生碰撞,但想要删除后者。
  3. 最好检查每个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值,如文档中所述。计算对象之间的碰撞是必需的。