【问题标题】:Box2D: How to detect an object no longer collide with another object?Box2D:如何检测一个物体不再与另一个物体碰撞?
【发布时间】:2011-11-19 01:52:07
【问题描述】:

Flash Box2D 问题(但我猜“flash”部分无关紧要)

假设有一个对象A,就是角色 还有一个物体B,也就是地面

假设角色只有在接触地面时才能行走。

有一个盒子 2d 接触监听器,我可以检测一个物体何时接触另一个物体,所以我可以用它来监听角色何时接触地面。但是我怎么知道角色是否离开了地面呢?

感谢阅读。

【问题讨论】:

    标签: flash box2d


    【解决方案1】:

    假设有一个对象A,它是 角色和对象 B,其中 是地面

    假设角色只能走路 当他触地时。

    假设您的对象 A 是 b2Body,称为 objectA 并且 objectB 是另一个称为 objectB 的 b2Body,而您的世界称为 m_world。如果对象B 是地面,我猜它的密度为 0,这使它成为静态的。 如果你想检查 objectA 是否高于 objectB 你有两个选择,要么通过身体本身,这意味着使用 box2d 单位测量(1 米 = 30 像素), 或者使用通过 userData 属性设置的对自定义剪辑的引用。

    我猜,使用第二个的好处是您将使用常规像素单位,请记住您的注册点位于中心而不是 0,0。

    所以,在你的更新循环中(你调用 m_world.Step 的地方)你会有类似的东西:

    if((objectA.m_userData.y + objectA.m_userData.height*.5) < (objectB.m_userData.y-objectB.m_userData.height*.5)) trace('objectA is above ground');
    else trace('objectB is on the ground');
    

    刚刚阅读您的评论并再次更新。

    我开始为 flash 编写一个 jsfl 命令,该命令从舞台上的元素中获取 x、y、width、height 并生成 box2d 代码。我用它来制作这个简单的游戏: http://www.disturbmedia.com/games/breakfast 似乎我不需要重新发明轮子,因为其他人已经做出了相当一致的事情。刚从 LFPUG 回来,Carlos Ulloa 也谈到了 box2d,他指出了这件事:

    http://www.sideroller.com/wck/

    它似乎为您需要的更复杂的形状定义生成坐标数组。在某种程度上,这不是对您特定问题的完整答案,但它是向前迈出的一步。

    根据您的描述,这个游戏听起来很有趣。让我们更新:)

    【讨论】:

    • 我闪存中的物体总是在移动:p 它们是某种生命形式,不断地在做动作……但我需要知道它们是否在地面上。所以 isSleeping 对地面检测没有帮助。非常感谢您的回答。
    • 我已根据您的评论编辑了我的答案。希望这会有所帮助。
    • @zifre 我的意思是 Box2DAS3。我不知道它在 C++ 中是怎样的,而且当我盯着 Flash 时,这很方便:“第一个是 Box2D 测量单位,在你意识到 Box2D 使用 1mt = 30 像素的米之前,它可能看起来很奇怪。”引用的来源在这里:emanueleferonato.com/2008/11/16/… 我希望我对 Box2D 的 as3 版本没有错,因为使用这个单元对我来说一切正常。
    • Box2D - 所有版本 - 让您定义代码中的比率。预先编写的示例文件(例如 helloworld.as)带有 1m=30px 的设置,并引发了整个“1=30”的神话。也就是说,大多数使用 Box2D 的应用程序使用 1=30。 :)
    • @Andy 我不知道。所以你的意思是我可以使用 1m=1px 而不需要对 30 或 0.3333333333 做所有这些乘法?那太棒了。
    【解决方案2】:

    我想你在找这个:

    override public function EndContact(contact:b2Contact):void
            {
                if (contact.GetFixtureA().GetBody().GetUserData() != null)
                {
    

    【讨论】:

      【解决方案3】:

      在联系人监听器中,有一个名为 Remove(b2ContactPoint) 的方法。这个方法被物理引擎调用,两个物体不再接触。也就是说,他们已经没有联系点了。此时您可以检测到作为演员的身体 A 没有漂浮。

      另一个很酷的解决方案是从 Actor 到地面进行光线投射,检查它们之间的距离,您可以判断您是在漂浮还是在行走。希望这有效

      【讨论】:

        【解决方案4】:

        我不久前就解决了这个问题,虽然我的解决方案很傻,但效果很好。我只是将地面的密度、恢复力和摩擦力设置为一些“神奇”的数字,然后在我的联系监听器中检查其中一个物体是否有这些数字,而另一个物体是我的精灵。

        就像我说的那样,这很傻,但我还没有看到其他东西这么简单。

        【讨论】:

          【解决方案5】:

          我确定 box2d 版本在您提出问题后发生了变化。

          目前检查地面碰撞的常用方法是检查碰撞“法线”的方向。

          如果它是向上的,那么继续并假设英雄已接地,并允许行走。

          回答您问题的其他部分

          有 BeginContact 和 EndContact。

          我经常在我的英雄上存储一个 var grounded:Boolean 变量来跟踪,我什至在跳跃时手动将其设置为 false 以避免在英雄离开地面之前多次发生跳跃。

          我希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多