2014-10-16 25 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()方法運行後,必須標記該主體並更改主體的狀態。