Box2D:如何检测一个对象不再与另一个对象发生碰撞?

时间:2009-03-25 08:00:36

标签: flash box2d

Flash Box2D问题(但我想“闪光”部分并不重要)

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

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

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

感谢阅读。

5 个答案:

答案 0 :(得分:4)

  

假设有一个对象A,即   角色和对象B,其中   是基础

     

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

假设您的对象A是b2Body,称为objectA和 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/

似乎为更复杂的形状定义生成坐标数组,这正是您所需要的。在某种程度上,这不是您具体问题的完整答案,但这是一个有效的步骤。

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

答案 1 :(得分:2)

我认为你在寻找这个:

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

答案 2 :(得分:1)

在联系人侦听器中,有一个名为Remove(b2ContactPoint)的方法。这种方法被物理引擎调用,两个物体不再接触。换句话说,他们不再有接触点了。你可以在那时检测到作为演员的身体A没有浮动。

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

答案 3 :(得分:1)

我回过头来解决了这个问题,虽然我的解决方案很狡猾,但效果确实很好。我只是将地面的密度,恢复原状和摩擦力设置为一些“魔法”数字,在我的联系人听众中,我只是检查其中一个身体是否有这些数字而另一个身体是我的精灵。

就像我说的那样,这很愚蠢,但我还没有看到其他有用的东西。

答案 4 :(得分:1)

我确定自你提出问题以来box2d版本已经改变了。

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

如果向上,则继续并假设英雄已停飞,并允许行走。

回答问题的其他部分

有BeginContact和EndContact。

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

我希望这会有所帮助。