我正在开发一个简单的基于图块的2D游戏。我有一个级别,填充了可以与瓷砖互相交互的对象。检查与tilemap的碰撞是相当容易的,并且可以对具有线性复杂性的所有对象进行。但现在我必须检测对象之间的碰撞,现在我必须检查每个对象与其他所有对象,这会导致方形复杂性。
我想避免方形复杂性。是否有任何众所周知的方法来减少对象之间的冲突检测调用。是否存在任何数据结构(如BSP树),它们易于维护并允许一次拒绝许多冲突。
例如,关卡中的对象总数约为500,一次在屏幕上看到约50个...
谢谢!
答案 0 :(得分:9)
为什么不让磁贴存储有关哪些对象占用它们的信息。然后,只要将对象移动到新图块,就可以检测到碰撞,方法是查看该图块是否已包含其他对象。
这几乎不会花费任何费用。
答案 1 :(得分:4)
您可以使用四叉树来划分空间并减少需要检查碰撞的物体数量。
See this article - Quadtree demonstration.
And perhaps this - Collision Detection in Two Dimensions.
Or this - Quadtree (source included)
乍一看,维护树需要大量的CPU能力,但它也会显着减少检查次数(参见第一个链接中的演示)。
答案 2 :(得分:0)
您的游戏已经具有与游戏相关的瓷砖地图的概念。您可以选择此贴图进行碰撞检测,也可以在专门用于精灵跟踪和碰撞检测的游戏场上覆盖辅助网格。
在您的网格中,每个精灵占据一个或多个图块。精灵知道它占据了哪些瓷砖,瓷砖知道哪些精灵占据了它。精灵移动时,您只需要检查精灵占据的图块内的碰撞。这意味着根本不需要碰撞检测,除非精灵接近占据相同的区块,即便如此,您只需要检查靠近的精灵之间的碰撞。
如果您的游戏玩法经常聚集在一起,您可能希望将网格实现为四叉树,以允许细分每个图块并防止太多精灵占用相同的网格图块。
此外,根据您的实现,您可能需要使用稍大的边界框来确定磁贴占用率,而不是用于确定冲突。这样你就可以保证精灵在碰撞边界接触之前会重叠并占据同一个瓷砖。