如何检测pygame冲突?

时间:2018-09-11 19:42:59

标签: python pygame collision

我目前正在与pygame一起开发一款小型游戏,但我很难找到一种检查碰撞的方法。我找到了this question,但是我不能使用pygame.sprite.spritecollide(player, wall_group, True),因为我的被叫玩家不是'sprite',而是我创建的类(使用正常形状的功能(https://www.pygame.org/docs/ref/draw.html)。

如果有人能找到一种方法来检测碰撞并很快向我解释“ sprite”与仅是普通形状(如圆形/矩形)之间的区别,

1 个答案:

答案 0 :(得分:0)

要使用pygame的归类检测功能(如pygame.sprite.spritecollide),您的类不必是pygame的Sprite的子类。

多亏了python的鸭子输入,只要您的类的行为像Sprite,实际的类就没有关系。在这种情况下,这仅意味着您的类应该具有rect属性,并且应该是Rect(再次,从技术上讲,它不必是Rect,只需“看起来像“一个”。

给出一个像这样的简单类:

>>> class Foo():
...   def __init__(self):
...     self.rect=pygame.rect.Rect(100, 100, 100, 100)

我们可以像这样使用pygame.sprite.spritecollide

>>> f=Foo()
>>> g=Foo()

>>> pygame.sprite.spritecollide(f, [g], False)
[<__main__.Foo instance at 0x0000000003C6DF48>]

还可以看到第二个参数不是Group,而是简单的List,但是python并不在乎,因为在这种情况下唯一重要的事情是您可以迭代宾语。如果您将True作为第三个参数传递,则会失败,因为spritecollide会尝试调用sprites()和第二个参数以及kill()在内部元素上。

例如,如果您想使用像素完美碰撞检测,则需要一个mask属性等。因此,无论如何,您都应该使用Sprite类,因为它提供了诸如管理组之类的更多功能。另外,每次要存储位置或大小时,请考虑使用pygame的Rect类,因为它功能强大,并且已在很多pygame函数中使用/预期。

tl; dr::使用pygame的Sprite类。您可能没有充分的理由不这样做,而实际上却有很多理由要使用它。