【问题标题】:Box2D Actionscript 3 questionBox2D Actionscript 3 问题
【发布时间】:2011-08-12 08:49:20
【问题描述】:

我在动作脚本 3 中使用 box2d 创建了一个世界,并且我有一个小盒子可以在键盘上向左、向右等移动,但是当用户例如在空中继续按下向上按钮时,小的盒子继续走高。

我如何只允许用户在触及一些过度形状后才能在空中飞得更高

    C.log("UP Key pressed");
    myChar.SetLinearVelocity(new b2Vec2(0, -1) );
    myChar.ApplyForce(new b2Vec2(0, -100), myChar.GetPosition());

【问题讨论】:

标签: flash actionscript-3 flash-builder box2d


【解决方案1】:

box2d flash 中的碰撞检测是我刚开始时最难理解的事情之一。

所有碰撞的信息都由接触侦听器类提供。要对特定的碰撞(例如,myChar 和地面对象之间的碰撞)做出反应,您需要覆盖基础联系人侦听器类中的函数,并检查联系人是否是您感兴趣的联系人。具体来说,覆盖 BeginContact 和EndContact 函数并检查接触是在玩家身体和地面身体之间。当两个物体分别第一次接触和停止接触时会触发这些函数,并且它们作为参数接受的 b2Contact 类包含有关两个固定装置发生碰撞的信息。

因此,在您覆盖的 BeginContact 函数中,您将检查任一主体是否为地面主体而另一主体为玩家,然后将您的地面变量设置为 true。在覆盖的 EndContact 函数中,您将再次检查以确保联系人引用正确的主体,然后将接地变量设置为 false。最后,当玩家按下跳跃键时,检查接地变量,如果为真,则允许玩家跳跃。

一些半伪代码:

override BeginContact(contact:b2Contact):void {
    check to see whether GetFixtureA().GetBody() or GetFixtureB().GetBody() is ground and the other is player
        grounded = true;
}

override EndContact(contact:b2Contact):void {
    again, check both bodies
        grounded = false;
}

根据您设置地面物体的方式,最好记下玩家当前接触的地面物体数量,如果该数量大于 0,则允许玩家跳跃.

Todd's Box2D Tutorials 对我来说是最有用的资源。尽管它们指的是 box2d 2.02 而不是最新的 2.10,但 contact listener stuff 是相似的。 box2d 源文件中的代码 cmets 也有有用的实现指南。

我希望这能让你开始。如果有什么更清楚的,请告诉我。

【讨论】:

    【解决方案2】:

    使用变量来跟踪对象是否接地。将 SetLinearVelocity 放在检查该变量的 if 语句中,并在 if 语句中将变量设置为 false:

    var grounded:Boolean = true;
    ...
    if (grounded) {
      SetLinearVelocity
      grounded = false;
    }
    

    然后在与地面发生碰撞时将变量设置回 true。

    【讨论】:

    • 是的,但我如何检查它是否接地?
    • 为地面制作一个碰撞对象,然后在盒子与地面碰撞时设置“grounded = true”。
    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多