如何在pygame中检测冲突?

时间:2019-05-24 03:08:34

标签: python math pygame 2d-games

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

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

我的尝试

        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

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

2 个答案:

答案 0 :(得分:0)

碰撞检查会检查水平或垂直位置是否重叠:

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

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

答案 1 :(得分:0)

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

在此处查看文档:{​​{3}}

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

对于您给出的示例,我假设您的单个导弹和类星体都是PyGame中的Sprites。

然后,我假设各个导弹和天体都在名为“导弹”和“天体”的Sprite组中。

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

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

这将检查导弹和天体之间是否发生碰撞,并杀死检测到所有碰撞的精灵。如果您的精灵没有“ rect”值,您还可以提供自定义碰撞计算功能来确定碰撞。