2012-04-27 130 views
1

我搜索碰撞检测主题,但他们都是关于检测本身。我的问题更多的是在检测过程之前和之后。我正在写我的第一场大型比赛,我想尽可能提高效率。设置碰撞检测,然后处理2D游戏中的碰撞

游戏的前提是你在游戏区周围飞行。在这个领域将会成为环境,敌舰,以及在太空中漂浮和漂浮的抛射物所提供的不同性质的障碍。如果需要或想要,对象将能够围绕其中心旋转。

我的设置测试的想法是让对象以某种方式加载到队列和列表中。然后游戏将采取队列前面的任何内容并对列表中的所有内容进行测试。它会首先检查以确保列表中的东西不是自己的(这会一直产生一切碰撞的声音)。接下来,游戏将检查队列中的对象与列表中的对象之间是否存在冲突。如果发生碰撞,那么它会标记对象说他们已经发生碰撞,并保存一个参考或任何物体碰撞的内容。例如,如果A与B碰撞,则游戏会告诉A运行碰撞函数,B运行碰撞函数,并且将存储到A中对B的引用,B将存储对A的引用。

然后,游戏将继续检查队列中的对象的冲突,直到它遍历列表为止,每次执行上述操作以说明多个对象击中或被多个对象击中的对象。例如,如果有三个球,A,B和C以及A​​在同一帧中被B和C两者击中,则A的速度将被B修改,然后被C修改,并且B和C的速度将由A修改。

这样做是否明智?我现在并不担心实际发现的碰撞事件,还有大量的文章或教程以及我自己的想法来解决这个问题。我没有遇到任何前后谈过的事情。我不确定队列和列表中有多少东西会开始导致大量负载并降低游戏速度。现在我的物体都只有x,y位置,x,y速度,他们面对的方向以及其他一些东西。

现在我想我开始漫无边际的事情了。任何洞察力或智慧将不胜感激。

+0

移动向量是否在您遍历队列时更新?看起来B和C的运动向量会被A _after_ A修改后的运动向量发生变化。 – 2012-04-27 16:34:44

+0

它会保存旧值和新值,运行检测过程,然后所有对象会根据需要进行更新。所以在这个例子中,A会与B进行交互,A会保存新的速度。然后,它会与C进行交互,C会修改并保存更新的速度。然后,一旦游戏退出检测,它会运行一个过程来更新对象,使他们使用他们的新速度或做任何事情。 – Azaral 2012-04-27 16:51:25

+0

是的,但是当你计算C的新速度时,C不会使用A的新速度吗?假设我可以想到最简单的碰撞响应,其中A具有起始速度(0,1)并且C具有(0,-1),B也具有(0,-1),A与B中的C和C碰撞相同的帧,首先它被B修改,给出A速度(0,-1),然后它与C碰撞,但是因为它们具有相同的速度矢量,所以它们都不会改变(或者它们都在相同方向上增加速度)。或者你的意思是新的速度存储在一个新的列表中,并且在所有计算完成后交换这些列表? – 2012-04-27 16:57:30

回答

2

对于许多游戏开发主题,没有通用的答案,这一点,它取决于你的类型的游戏,但保留一些东西记住,当涉及到你的对象的遍历:

  • 尝试想想如何在碰撞检测后做出实际反应(你会使用双重调度,访问者,向下转换/ rtti,存储可以在功能图中使用的特征,...)。有多种技术,都有其优点和缺点。你选择的方法可以反映你如何做实际的遍历。
  • 尝试分割对象类型的场景。例如,如果你有很多永远不会移动的静态对象,那么将所有对象进行测试都是荒谬的,你应该将它们分开。但作为一个经验法则,不要试图专门化这个太多,像staticdynamic可能会带来很大的好处,有100个类型将产生通常没有真正的收益维护地狱。
  • 这可能与您的遮挡机制有关。例如,如果它是基于门户的,则来自不同单元格的对象将不可能碰撞。

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

+0

有一些很好的教程的链接,对于其中的一些东西,最好是一步一步地完成。我最难学习的东西只是通过阅读,需要看到它发生并解释。 – Azaral 2012-04-27 17:42:20

+0

@Azaral:我所知道的关于碰撞检测的大部分内容来自经验或阅读独立文章。我无法真正推荐一本书或教程。 – KillianDS 2012-04-28 10:27:42

+0

好的,谢谢。 – Azaral 2012-04-28 12:21:30