首页 > 解决方案 > 如何检测 pygame 中的碰撞?

问题描述

我正在制作一款小行星太空射击游戏,但我不知道如何在我的子弹与小行星/外星人,当然还有飞船之间进行碰撞。

我尝试过检查位置,但我的方法过于复杂,落后于游戏,实际上根本不起作用。

我的尝试:

        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

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

标签: pythonmathpygame2d-games

解决方案


PyGame 已经提供了 Sprite 之间的碰撞检测。碰撞检测交给了一些 C 代码,并经过高度优化。您不应该尝试在 Python 中重新评估碰撞计算,因为它肯定不会像 PyGame 的原生解决方案那样快,并且它正在引入新错误的机会。

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

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

对于您给定的示例,我假设您的单个导弹和小行星都是 PyGame 中的精灵。

然后我假设单个导弹和小行星在名为“导弹”和“小行星”的 Sprite 组中。

如果这是真的,您可以简单地执行以下操作:

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

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


推荐阅读