设置碰撞检测,然后在 2D 游戏中处理碰撞

Setting up for collision detection and then dealing with a collision in a 2D game

本文关键字:游戏 处理 碰撞 2D 碰撞检测 然后 设置      更新时间:2023-10-16

我搜索了碰撞检测主题,但它们都是关于检测本身的。我的问题更多的是关于检测过程之前和之后。我正在写我的第一个大型游戏,我想让它尽可能高效。

游戏的前提是你在运动场上驾驶一艘船。在这个领域,环境、敌舰和在太空中飞行和漂浮的射弹提供了不同性质的障碍物。如果需要或想要,这些对象将能够围绕其中心等旋转。

我设置测试的想法是让对象以某种方式将自己加载到队列和列表中。然后,游戏将获取队列前面的任何内容,并针对列表中的所有内容进行测试。它将首先检查以确保列表中的内容不是它自己(这将一直为所有内容生成冲突,哈哈(。接下来,游戏将检查队列中的对象与列表中的对象之间是否存在冲突。如果发生碰撞,那么它将标记对象,说明它们已碰撞并保存引用或对象碰撞的任何内容。

例如,如果 A 与 B 发生碰撞,游戏会告诉 A 运行碰撞函数,B 运行碰撞函数,并将对 B 的

引用存储到 A 中,B 将存储对 A 的引用。

然后,游戏将继续检查队列中对象的碰撞,直到它运行列表,每次都执行上述操作以说明一个对象击中或被多个对象击中。

例如,如果有三个球,A、B 和 C,并且 A 被

B 和 C 在同一帧中击中,则 A 的速度将由 B 修改,然后由 C 修改,B 和 C 的速度将由 A 修改。

这是这样做的明智之举吗?我现在并不担心碰撞的实际检测,有很多文章或教程以及我自己的想法来解决这个问题。我没有遇到任何前后说话的东西。我不确定队列和列表中有多少东西会开始导致大量负载并减慢游戏速度。现在我的物体都只是x,y位置,x,y速度,它们面向的方向,以及其他一些东西。

现在我想我开始喋喋不休地谈论不相关的事情。任何见解或智慧将不胜感激。

至于许多游戏开发主题,这个问题没有通用的答案,这取决于你的游戏类型,但在遍历对象时请记住一些事项:

  • 试着考虑一下在碰撞检测后你将如何做出实际反应(你会使用双重调度、访问者、向下投射/rtti、存储可以在函数图中使用的特征,......有多种技术,都有其优点和缺点。您选择的方法可以反映在实际遍历的方式中。
  • 尝试将场景拆分为对象类型。例如,如果您有许多永远不会移动的静态对象,那么将它们相互测试是荒谬的,您应该将它们分开。但根据经验,不要试图过多地专门化,拥有 static vs dynamic 之类的东西可能会带来很大的好处,拥有 100 种类型会产生一个维护地狱,通常没有真正的收益。
  • 这可能与您的遮挡机制有关。例如,如果它是基于门户的,则来自不同单元格的对象不太可能发生碰撞。

我现在可能忘记了一些其他提示,因为这是一个复杂的话题,但我希望它能让你继续前进。