【问题标题】:box2d crush on SetActivebox2d 对 SetActive 的迷恋
【发布时间】:2014-10-16 13:58:19
【问题描述】:

我正在用box2d physicscocos2d-x 上编写一个游戏,当它们离开屏幕时我正在禁用一些装置。

但我得到了这个错误:

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

当我这样做时:

_physicsBody->SetActive(false);

有人知道发生了什么吗?

【问题讨论】:

    标签: cocos2d-x box2d


    【解决方案1】:

    虽然世界正在更新,但您可以更改的内容是有限的。所以无论你在哪里调用 SetActive(),它都是在世界步骤中发生的,这是不允许的。

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

    【讨论】:

      【解决方案2】:

      是的。

      嗯,再三考虑,我可能应该对此进行更多详细说明。 :)

      世界->IsLocked 断言发生在您执行改变世界状态的操作同时世界状态正在更新

      因此,在 world->Step 方法期间,您无法随时更改主体的活动状态,这在 99.9% 的情况下意味着您正尝试在其中一种碰撞回调方法中执行此操作。其他 0.01% 是由于尝试对物理模拟进行多线程处理。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-01
          • 2022-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-20
          • 1970-01-01
          • 2021-03-11
          相关资源
          最近更新 更多