【发布时间】:2014-10-16 13:58:19
【问题描述】:
我正在用box2d physics 在cocos2d-x 上编写一个游戏,当它们离开屏幕时我正在禁用一些装置。
但我得到了这个错误:
Assertion failed: (m_world->IsLocked() == false), function SetActive
当我这样做时:
_physicsBody->SetActive(false);
有人知道发生了什么吗?
【问题讨论】:
我正在用box2d physics 在cocos2d-x 上编写一个游戏,当它们离开屏幕时我正在禁用一些装置。
但我得到了这个错误:
Assertion failed: (m_world->IsLocked() == false), function SetActive
当我这样做时:
_physicsBody->SetActive(false);
有人知道发生了什么吗?
【问题讨论】:
虽然世界正在更新,但您可以更改的内容是有限的。所以无论你在哪里调用 SetActive(),它都是在世界步骤中发生的,这是不允许的。
你应该做的是标记那些你想改变活动状态的物体,然后在世界步骤之后做。例如,将所有实体放在一个列表中,然后在 Step() 之后对列表中的每个实体调用 SetActive()。
【讨论】:
是的。
嗯,再三考虑,我可能应该对此进行更多详细说明。 :)
世界->IsLocked 断言发生在您执行改变世界状态的操作同时世界状态正在更新。
因此,在 world->Step 方法期间,您无法随时更改主体的活动状态,这在 99.9% 的情况下意味着您正尝试在其中一种碰撞回调方法中执行此操作。其他 0.01% 是由于尝试对物理模拟进行多线程处理。
另外,在碰撞回调方法中也不能添加/销毁物体。在 world->Step() 方法运行后,您必须标记该主体并更改该主体的状态。
【讨论】:
感谢所有回复的人,你帮助了我.. 所以每个有这个问题的人你只需将你的节点标记为脏或其他东西,然后在更新时你可以对你的身体做任何你想做的事情。 谢谢。
【讨论】: