我正在使用box2d,并且有一些我正在销毁的物体(已经标记为需要删除),但是接触监听器仍然会崩溃,因为它得到了与这些物体相关的联系。
在接触监听器的presolve和begin contact方法中执行以下操作:
要么objectA,要么objectB 是指向无用的指针,因为该对象已从世界时间步中移除。看起来创建了错误的联系或者仍然存在的联系已经不应该存在。 更新 我已经更改了代码,确保验证正确的物体被销毁(及其容器物体),并发现接触侦听器仍在尝试处理不应存在的联系。我正在使用iOS/Xcode平台,启用NSZombie,确实发现接触体userdata是已经删除的对象(消息发送到已释放的实例)。检查Box2d源代码,我发现当物体被销毁时,接触确实被销毁了。我将不得不浏览更多Box2D代码或仅更改我的代码以避免侦听器收到的神秘接触。
当我测试将身体的userdata设置为null(同样,在世界步骤之外),我在接触侦听器中接收到的此身体的接触(在接触侦听器中检查时)并没有空的userdata。
在接触监听器的presolve和begin contact方法中执行以下操作:
const b2Body* bodyA = contact->GetFixtureA()->GetBody();
const b2Body* bodyB = contact->GetFixtureB()->GetBody();
Object * objectA = (Object*)bodyA->GetUserData();
Object * objectB = (Object*)bodyB->GetUserData();
要么objectA,要么objectB 是指向无用的指针,因为该对象已从世界时间步中移除。看起来创建了错误的联系或者仍然存在的联系已经不应该存在。 更新 我已经更改了代码,确保验证正确的物体被销毁(及其容器物体),并发现接触侦听器仍在尝试处理不应存在的联系。我正在使用iOS/Xcode平台,启用NSZombie,确实发现接触体userdata是已经删除的对象(消息发送到已释放的实例)。检查Box2d源代码,我发现当物体被销毁时,接触确实被销毁了。我将不得不浏览更多Box2D代码或仅更改我的代码以避免侦听器收到的神秘接触。
当我测试将身体的userdata设置为null(同样,在世界步骤之外),我在接触侦听器中接收到的此身体的接触(在接触侦听器中检查时)并没有空的userdata。