Cocos2d-x 3 - 禁用两个物体之间的碰撞,并检测它们彼此分开的时间

时间:2015-09-29 20:29:32

标签: cocos2d-x game-physics cocos2d-x-3.0 chipmunk

我正在开发一款cocos2d-x游戏(3.8版本)。我的游戏使用的是花栗鼠物理,它有一个像中断器一样工作的静态体。当另一个物体在它上面时启用此中断器。当主体彼此分离时,中断器被禁用。

我想:

  • 移动体不与中断器碰撞。它必须跨越中断或没有反弹
  • 我想检测移动体分离中断器

我的第一种方法是实现onContactBegin方法。当这两具尸体接触时,我会返回假。这样,身体就会穿过中断器并且不会反弹。

问题是没有调用onContactSeparate方法,因为没有发生联系。

如果我在onContactBegin方法中返回true,则调用onContactSeparate并且我可以检测到它。问题是身体没有穿过阻断器,它会反弹。

[编辑]更多信息

这是两个精灵分开的场景。球可以移动,中断器是静止的身体。球可能会超过中断者。

Interruptor disabled

这是两个精灵接触并且object1(球)在中断器上的情况。我想检测两个精灵彼此分开的位置。

Interruptor enabled

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

在我看来,你在科科斯中使用的是Box2D,所以我将以此作为我的基本假设。

这就是我要做的。

  1. 我的中断器将是一个b2Body *,没有定义BodyDef尺寸,或只是一个0x0尺寸def。
  2. 我会将bodyDef的用户数据设置为描述我的中断区域的矩形。通过这种方式,您可以始终显示中断区域,但不会与任何内容发生碰撞。
  3. 可选)如果您希望中断区域根据您分配给它的假身体移动,您可以使用以下内容在步骤功能之后更新它。 / p>

    world->Step(delta, 10, 10);   
    for (auto physicsBody = _world->GetBodyList(); physicsBody; physicsBody = physicsBody->GetNext())
    { 
     auto userData = static_cast<Node*>(physicsBody->GetUserData());
     if(userData != NULL)
     {
       // Set interruptor area rectangle = physicsBody->GetPosition();
     }
    }
    
  4. 为了让系统的其余部分知道我何时离开中断器,我会在发生这种情况时存储一个函数指针指向我要调用的函数。当一个对象进入中断区域时,我会标记它说& #34;我在该地区&#34;在那之后,当你不再在该区域时,你得到的第一个更新步骤我将触发回调并重置我曾经达到的标志。

  5. 我希望这会有所帮助。你没有给出你想做的事情的大量背景,图像会有所帮助。特别是在寻找具有可视化表示的代码的帮助时。

    [修改] 基于您想要的行为,这就是我这样做的方式。首先要知道的是,您不需要物理碰撞来实现您想要的行为。您可以通过使用边界框交叉测试来执行此操作,并使用标记和回调来确定其余部分。

    我有一个知道球和中断节点的对象。在这个对象的更新循环中,我检查两个是否相交。我设置了一个标志,表示&#34;我在中断器中#34;,我不在中断器中的下一帧,我的标志仍然是真的我调用我分配给我的功能&#34;离开逻辑&#34;在其中,然后将标志设置为false。