碰撞检测代表方案

时间:2010-10-28 07:03:36

标签: delegates collision-detection delegation

嘿伙计们!我的物理引擎很顺利(感谢您的提问!),我已经准备好开始研究一些更高级的垃圾了。例如,我正在尝试设置我的碰撞引擎,以便在发生碰撞时通知任意代理。让我为你设置一个场景:

假设我们在物理模拟中有对象A,对象B和对象C.我希望能够告知代表A和B之间的冲突,并告知潜在的不同代表有关A和C之间的冲突。

一些背景信息:我有一个已知的代理接口,我有可能为我的碰撞检测器存储状态(但不要atm),并且能够在对象本身中存储状态。类似地,我使用此委托模型来处理冲突解决,默认情况下只需将物理引擎设置为所有对象的委托,允许用户根据需要更改委托。

现在,我已经尝试让每个对象存储它自己的碰撞委托,当发生碰撞时会通知它。这不起作用,因为当对象具有相同的碰撞委托时,相同的碰撞被处理两次。当我切换到仅使用第一个对象的委托时(无论如何确定),模拟的顺序成为一个问题。我想使用字典,但这会带来大量的开销。然而,这似乎是我需要前进的方向。

所以这就是问题:在合适的解决方案中战死。你将如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我必须说两个对象可以拥有不同的委托(碰撞时)有点奇怪,如果两个相同的委托在碰撞中被解雇,那么它仍然会很糟糕。我好像他们应该一直开火,或者只有其中一个开火。一致性是困扰我的地方。 解释这将有助于更多。

其次,如果您使用为每个对象保留委托的天真版本,然后调整激活其功能(“if(!一些布尔表示此委托已被解雇){do something}”),这可以通过一个非常小的开销。 它有效,但我不喜欢这种代码。

我的建议(有点复杂,所以在开始之前要考虑它)是试着专注于一个管理器对象,它会覆盖所有代理并调用与碰撞相关的两个代理。 例如,A和B冲突,并使用它们作为参数调用管理器。您现在可以循环遍历系统已知的所有委托(假设它们很少)并触发与“delegate == a.del或delegate == b.del”匹配的委托。 这会带来更大的开销,但如果我们谈论的是少数代表,那么会产生很小的影响。另一方面,这将允许您将来更多地在此区域中使用碰撞检测引擎(例如每个对象存在多个代理)。