我目前正在用pygame开发一个小游戏,我很难找到一种检查碰撞的方法。我找到了这个问题,但我无法使用pygame.sprite.spritecollide(player, wall_group, True)
,因为我调用的玩家不是"精灵",而是我创建的类(使用普通形状的功能 (https://www.pygame.org/docs/ref/draw.html((。
如果有人能找到一种方法,我可以检测碰撞并简要向我解释"精灵"与圆形/矩形等正常形状之间的区别,我将不胜感激。
要使用pygame的碰撞检测功能(如pygame.sprite.spritecollide
(,你的类不需要是pygameSprite
的子类。
多亏了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
类。你可能没有充分的理由不这样做,而有很多很好的理由来实际使用它。