python - 如何检测 pygame 碰撞?
问题描述
我目前正在使用 pygame 开发一个小游戏,但我很难找到一种检查碰撞的方法。我找到了这个问题,但我不能使用,pygame.sprite.spritecollide(player, wall_group, True)
因为我被调用的玩家不是“精灵”,它是我创建的一个类(它使用正常形状的功能(https://www.pygame .org/docs/ref/draw.html ))。
如果有人能想出一种方法来检测碰撞并尽快向我解释“精灵”与普通形状(如圆形/矩形)之间的区别,我将不胜感激。
解决方案
要使用 pygame 的碰撞检测功能(如pygame.sprite.spritecollide
),您的类不需要是 pygame 的子类Sprite
。
多亏了 python 的鸭子类型,实际的类并不重要,只要你的类表现得像Sprite
. 在这种情况下,它只是意味着你的类应该有一个rect
属性,并且它应该是 a Rect
(同样,从技术上讲,它不需要是 a 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>]
另请参阅第二个参数如何不是 a Group
,而是一个简单的List
,但 python 不在乎,因为在这种情况下唯一重要的是您可以迭代对象。如果你将True
作为第三个参数传递,这将失败,因为spritecollide
会尝试调用sprites()
第二个参数和kill()
里面的元素。
同样,如果你想使用像素完美碰撞检测,你需要一个mask
属性等。所以Sprite
无论如何你都应该使用这个类,因为它提供了更多的东西,比如管理组。此外,每次您想存储位置或大小时,请考虑使用 pygame 的Rect
类,因为它非常强大,并且在许多 pygame 函数中使用/预期。
tl; dr:使用 pygame 的Sprite
类。您可能没有充分的理由不这样做,并且有很多充分的理由来实际使用它。
推荐阅读
- java - 找不到参数的方法 implementation() [com.google.firebase:firebase-core:17.0.0]
- javascript - axios正常GET请求进度
- json - 通过 jq 将 aws cli 解析为 CSV
- python - 损坏的 JPEG 数据:标记 0xdb OpenCV 与 macOS Mojave 之前的 20 个无关字节
- centroid - 从几何形状字段创建质心列会产生 AttributeError: 'NoneType' object has no attribute 'centroid'
- python-3.x - 为什么子处理 tcprewrite 会导致 EOF 错误?
- sql - 在 Azure 数据工厂中成功完成数据流后,为什么没有将数据传输到我的接收器表?
- r - XLConnect 安装在 R for windows 中失败
- vba - Word VBA:将注释和用户名转换为脚注;需要作者(现在在脚注中)加粗
- ios - 如何将在构建阶段创建的文件添加为捆绑资源?