box2d粉碎了SetActive

时间:2014-10-16 13:58:20

标签: cocos2d-x box2d

我正在使用cocos2d-xbox2d physics上编写游戏,当他们离开屏幕时,我正在禁用一些灯具。

但我收到了这个错误:

Assertion failed: (m_world->IsLocked() == false), function SetActive

我正在这样做:

_physicsBody->SetActive(false);
谁知道发生了什么事?

3 个答案:

答案 0 :(得分:1)

在更新世界的同时,您可以改变的是有限的。所以无论你在哪里调用SetActive(),它都会在世界步骤中发生,这是不允许的。

您应该做的是标记您希望更改活动状态的身体,然后在世界步骤之后执行此操作。例如,将所有实体放在列表中,然后在Step()之后对列表中的每个实体调用SetActive()。

答案 1 :(得分:1)

嗯,第二个想到我可能应该详细说明这一点。 :)

世界 - > IsLocked断言发生在世界状态正在更新时执行改变世界状态的内容

因此,在世界 - >步骤方法中,您无法随时更改身体的活动状态,其中99.9%的情况意味着您在其中一次碰撞中尝试执行此操作回调方法。另外0.01%是由于尝试多线程化物理模拟。

此外,在碰撞回调方法中也无法添加/销毁主体。在world-> Step()方法运行后,您必须标记该主体并更改主体的状态。

答案 2 :(得分:1)

感谢所有回复的人,你帮助了我.. 所以每个有这个问题的人都必须将你的节点标记为脏或其他东西,然后在更新时你可以做任何你想对你的身体做的事情。 感谢。