1

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

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

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

有一个 box 2d contact listener,当一个物体接触到另一个物体时我可以检测到,所以我可以用它来听角色何时接触地面。但是我怎么知道角色是否离开了地面?

谢谢阅读。

4

5 回答 5

4

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

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

假设您的对象 A 是称为 objectA 的 b2Body,而 objectB 是另一个称为 objectB 的 b2Body,而您的世界称为 m_world。如果 objectB 是地面,我猜它的密度为 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/

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

从你的描述来看,这个游戏听起来很有趣。让我们更新:)

于 2009-04-12T21:47:27.477 回答
2

我想你正在寻找这个:

override public function EndContact(contact:b2Contact):void
        {
            if (contact.GetFixtureA().GetBody().GetUserData() != null)
            {
于 2011-10-28T14:01:16.673 回答
1

自从您提出问题以来,我确定 box2d 版本已经改变。

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

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

回答您问题的其他部分

有 BeginContact 和 EndContact。

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

我希望这会有所帮助。

于 2011-02-09T16:58:08.767 回答
1

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

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

于 2009-04-29T11:51:08.953 回答
1

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

就像我说的那样,这很愚蠢,但我还没有看到其他简单的方法。

于 2010-12-16T17:41:37.767 回答