AS3与box2d在平台游戏中坠落时的奇怪效果

时间:2015-08-05 14:02:08

标签: actionscript-3 box2d velocity horizontal-scrolling

我正在使用AS3和box2D制作平台游戏。我有一个奇怪的问题,我无法弄清楚。角色一直在运行,触摸它跳跃 - 非常标准。但是当它从高点跳跃时,角色在重力下落时会失去水平速度,并且仅在Y轴上移动直到它接触地面然后恢复运行。奇怪的是,如果我减少重力就没有这种效果。我试着玩密度,摩擦力。也没有阻尼。

我搜索了与跳跃和下降以及速度问题相关的每个可能的box2d问题。找不到任何东西。

这是角色移动的代码。重力为20,时间步长为1/15。

public class HeroModel extends GameObjectModel
{
    public var isJumping:Boolean = false;
    public var isAlive:Boolean = true;
    public var forwardForce:b2Vec2;
    public var decreasingForceY:Number = -200;
    public var decreasingForceX:Number = 100;
    public var startPos:Point;
    public var jumps:Number = 1;

    public function HeroModel()
    {
        super();
    }


    override public function initFrom(initObj:Object, world:b2World):void
    {
        super.initFrom(initObj, world);

        var filterdata:b2FilterData = new b2FilterData();
        filterdata.groupIndex = 1;
        filterdata.maskBits = 1;
        physicsBody.GetFixtureList().SetRestitution(0);
        physicsBody.GetFixtureList().SetDensity(0);
        physicsBody.GetFixtureList().SetFriction(0);
        physicsBody.GetFixtureList().SetFilterData(filterdata);
        physicsBody.SetType(b2Body.b2_dynamicBody);
        physicsBody.SetBullet(true);

        applyForwardForce();
        physicsBody.SetUserData(this);
        startPos = new Point(this.physicsBody.GetPosition().x, this.physicsBody.GetPosition().y);
    }

    public function die():void
    {
        //TODO Empty function.?
    }

    public function applyForwardForce():void
    {
        forwardForce = new b2Vec2(200,0);
        physicsBody.ApplyForce(forwardForce, new b2Vec2(0,0));
    }

    public function jump(e:EnterFrameEvent):void
    {

        if(decreasingForceY < 0 && decreasingForceX > 75)
        {
            physicsBody.ApplyImpulse(new b2Vec2(decreasingForceX, decreasingForceY), new b2Vec2(0,0));
            decreasingForceY+=5;
            decreasingForceX-=2.5;
        }

    }

    public function resetVelocity():void
    {
        decreasingForceX = 100;
        decreasingForceY = -200;
    }

}

screenshot

这是游戏的截图。红色就是发生了,绿色就是我想要的。

我错在哪里的想法? :)

2 个答案:

答案 0 :(得分:0)

20的重力很大(8或9更自然)。您描述的运动/反应与应用于公共汽车或大型卡车等大型物体的重力相吻合。我的猜测是你的角色实际上可能像公共汽车或卡车一样大。由于我在代码中没有看到任何使用的比例因子,这似乎是一个很好的假设。跳过比例因子可能会使一切变得更简单,但它无法使您的模拟变得切合实际。

Box2D必须与scalefactor一起使用,其度量单位为米,因此100x100对象是一个大型建筑物。

答案 1 :(得分:0)

我使用SetLinearVelocity修复它,现在它一切都很好。 :)

   public function jump(e:EnterFrameEvent):void
    {
        if (!singleJump)
        {
            physicsBody.IsAwake();
            physicsBody.IsBullet();



            physicsBody.SetLinearVelocity(new V2(75, -200));



            physicsBody.GetLinearVelocity();
            trace(physicsBody.GetLinearVelocity().x);
            trace(physicsBody.GetLinearVelocity().y);

            singleJump = true;