如何检测 pygame 中的碰撞?

How do I detect collisions in pygame?

我正在制作一款小行星 space 射击类游戏,但我不知道如何让我的子弹与 asteroids/aliens,当然还有飞船发生碰撞。

我尝试过检查位置,但我的方法过于复杂,滞后于游戏,而且根本不起作用。

我的尝试:

        for missile in missiles:
            for asteroid in asteroids:
                if missiles[missile][0] > asteroids[asteroid][0] or missiles[missile][0] + 20 < asteroids[asteroid][0] + 70:
                    # remove missile and asteroid

假设我有一颗小行星和一艘飞船,还有一颗子弹,我想要它,这样当小行星和子弹相撞时,它们都会被摧毁,而飞船不会,但是当小行星和飞船相撞时,它们都会被摧毁。

碰撞检查检查水平或垂直位置上的重叠:

if obj1.y + obj1.radius > obj2.y - obj2.radius
if obj1.y - obj1.radius < obj2.y - obj2.radius

x 方向执行相同的操作,但请记住,方向会根据像素向上的方向进行翻转

PyGame 已经提供了 Sprites 之间的碰撞检测。碰撞检测移交给了一些 C 代码并进行了高度优化。您不应该尝试在 Python 中进行 re-evaluate 碰撞计算,因为它肯定不会像 PyGame 的本地解决方案那么快,并且它会引入新错误的机会。

在此处查看文档:https://www.pygame.org/docs/ref/sprite.html

它将提供有关如何在精灵之间实施正确的碰撞检测的信息。

对于您给出的示例,我假设您的单个导弹和小行星都是 PyGame 内的 Sprites。

然后我假设单独的导弹和小行星在称为 'missiles' 和 'astroids' 的 Sprite 组中。

如果是这样,您只需执行以下操作即可:

pygame.sprite.groupcollide(missiles, astroids, true, true)

这将检查导弹和小行星之间的碰撞以及 kill/destroy 任何检测到碰撞的精灵。如果您的精灵没有 'rect' 值,您还可以提供自定义碰撞计算函数来确定碰撞。