【问题标题】:AS3 with box2d weird effect during falling in a platformer gameAS3 在平台游戏中摔倒时具有 box2d 怪异效果
【发布时间】:2015-08-05 14:02:08
【问题描述】:

我正在使用 AS3 和 box2D 制作平台游戏。我有一个奇怪的问题,我无法弄清楚。角色不断奔跑,一触即跳——非常标准。但是当它从高处跳跃时,角色在重力下落的过程中会失去水平速度,只在Y轴上移动,直到它接触到地面,然后重新开始奔跑。奇怪的是,如果我降低重力,就没有这样的效果。我试着玩密度,摩擦。也没有阻尼。

我在 Google 上搜索了所有可能与跳跃和下降以及速度问题相关的 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;
    }

}

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

任何想法我在哪里弄错了? :)

【问题讨论】:

    标签: actionscript-3 box2d velocity horizontal-scrolling


    【解决方案1】:

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

    Box2D 必须与比例因子一起使用,其测量单位为米,因此 100x100 的对象是一座大建筑物。

    【讨论】:

    • 我喜欢你的逻辑,我现在正在玩这个。我想到了一些其他的事情。我尝试将英雄设置为 1x1 像素,但它没有改变任何东西。我想那是因为我使用龙骨作为角色。然后我尝试使用此代码var massData = new b2MassData(); physicsBody.GetMassData(massData); massData.mass = 20.0 // or whatever; physicsBody.SetMassData(massData); 直接设置质量,我可以感觉到质量在变化,但我仍然得到不好的效果。现在我将尝试您建议的比例因子。
    【解决方案2】:

    我使用 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;
    

    【讨论】:

    • 我不明白:D 我是作者,我只是说我没有使用 ApplyImpuse,而是发现 SetLinearVelocity 解决了这个问题。
    • 我已经删除了评论,我的错!我应该分析过,作者是一样的!请添加一行代码您如何修复它以使您的回答更合适:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多