gpt4 book ai didi

box2d - 当 Box2D 主体在时间步外被破坏时,Contact Listener 崩溃

转载 作者:行者123 更新时间:2023-12-05 05:27:40 27 4
gpt4 key购买 nike

我正在使用 box2d 并且我正在破坏世界时间步长的物体(已将它们标记为要删除)但是由于获取引用这些物体的联系人,接触监听器仍然崩溃。

这是在接触监听器的 presolve 和 begin 接触方法中完成的:

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 并且确实发现联系人主体用户数据是释放对象(发送到释放实例的消息)。检查 Box2d 源我发现当 body 被摧毁时接触确实被摧毁了。我将不得不检查更多 Box2D 代码,或者只是更改我的代码以某种方式解决听众收到的这些神秘联系。

当我测试将正文的用户数据设置为空(同样,在世界之外的步骤)时,我在该正文的联系人监听器中收到的联系人(当我在联系人监听器中检查它时)没有空用户数据。

最佳答案

据我所知,box2d 主体的破坏与所有这些无关。 GetUserData 返回您在创建正文时传入的任何内容,这可能是垃圾。你吃者删除了它或者你传入了null。如果您能提供创建和销毁 body 的代码,我也许可以告诉您更多信息。

如果主体无效,则程序可能会崩溃:

contact->GetFixtureA()->GetBody();

或 bodyB 部分。

关于box2d - 当 Box2D 主体在时间步外被破坏时,Contact Listener 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17937083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com