2014-10-16 78 views
0

我正在写cocos2d-xbox2d physics的游戏,当他们离开屏幕时,我禁用了一些灯具。box2d迷恋SetActive

但我得到这个错误:

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

,而我这样做:

_physicsBody->SetActive(false); 

人知道发生了什么事?

回答

1

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

1

当世界正在更新时,你的能力有限,你可以改变。因此,无论你在哪里调用SetActive(),都会在世界步骤中发生,这是不允许的。

你应该做的是标记那些你希望改变活动状态的物体,然后在世界步骤之后执行它。例如,将所有主体放在一个列表中,然后在Step()之后的列表中的每一个上调用SetActive()。

1

是的。

嗯在第二想法我可能应该详细说明这一点。 :)

当世界状态正在更新时,只要您执行改变世界状态的世界→IsLocked断言就会发生。

所以你不能在世界期间的任何时候改变身体的活动状态 - >步骤方法,在所有情况下,99.9%意味着你正试图在碰撞回调方法中做到这一点。另外的0.01%是由于尝试多线程物理模拟。

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