我正在使用 Binary Space Partitioning Tree制作碰撞检测系统。我有两种对象:
- 需要检查与其他对象碰撞的动态对象(角色、射弹),
- 静态对象(如墙壁)不进行相互碰撞测试,但只能针对动态对象进行测试。
为此,我使用了两种数据结构:用于存储所有动态对象的列表,以及包含每个对象(动态或静态)的 BSP 树。因此,每个动态对象都存储在两个结构中。
最后,我通过遍历我的列表并使用树来测试每个对象来执行我的碰撞检测,如下所示:
foreach(DynamicObject dynobj in myListOfDynamicObjects)
{
//check the collision against every close dynamic or static objects
myBSPtree.CheckCollision(dynobj);
}
然而,在这一点上,我没有想到:两个动态对象之间的每次碰撞检查都会进行两次。例如 :
\ 动态对象列表:{dynA, dynB} 树:dynA / \ 静态1动态B
组合测试:
dyna - dyna(处理无用的情况)- 动态-静态1
- dynA - dynB
- dynB - dynA(同上)
- dynB - 静态1
dynB - dynB
为了跳过无用的检查,我想在每个对象上添加一个属性Order:它将是对象构造时给出的唯一标识符,并像这样使用:
if(dynA.Order < dynB.Order){ CheckCollision(dynA,dynB); }
这样,每个对象组合只进行一次碰撞检查。
我的问题是:如果这种技术是正确的(我的意思是它是一个好的设计吗?),并且由于每个对象在 C# 中都有一个唯一的引用,我可以像这样直接比较它们的引用吗:(?)
if(dynA.Reference < dynB.Reference){ CheckCollision(dynA,dynB); }
我们可以使用object.ReferenceEquals来查看两个引用是否相等,但是我们可以对这些引用进行实际比较吗?