0

大家好!我的物理引擎运行得非常好(感谢您的提问!),我已经准备好开始研究一些更高级的垃圾了。举个例子,我正在尝试设置我的碰撞引擎,以便在发生碰撞时可以通知任意委托。让我为您设置一个场景:

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

一点背景信息:我有一个已知的委托接口,我有可能为我的碰撞检测器存储状态(但不要 atm),并且有能力将状态存储在对象本身中。同样,我使用这个委托模型来处理碰撞解决方案,只需将物理引擎默认设置为所有对象的委托,允许用户在需要时更改委托。

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

所以问题来了:为了一个合适的解决方案而战至死。你将如何解决这个问题?

4

1 回答 1

1

我必须说,两个对象可以有不同的委托(在碰撞时)有点奇怪,如果两个相同的委托在碰撞时触发仍然会很糟糕。我似乎他们都应该一直开火,或者只有其中一个应该开火。一致性是困扰我的地方。解释一下会有所帮助。

其次,如果你使用简单的版本为每个对象持有一个委托,然后调节激活它的功能(“如果(!一些布尔值表明这个委托已经被触发){做某事}”),这可以用一个非常小的高架。它有效,但我不喜欢这种代码。

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

于 2010-10-30T05:58:19.537 回答