Actionscript 3 AS3在platformer游戏中摔倒时具有box2d怪异效果

Actionscript 3 AS3在platformer游戏中摔倒时具有box2d怪异效果,actionscript-3,box2d,velocity,horizontal-scrolling,Actionscript 3,Box2d,Velocity,Horizontal Scrolling,我正在使用AS3和box2D制作一个平台游戏。我有一个奇怪的问题,我想不出来。角色一直在奔跑,一触即跳——相当标准。但当它从高点跳下时,角色在重力作用下下落时会失去水平速度,只在Y轴上移动,直到它接触到地面,然后恢复跑步。奇怪的是,如果我减小重力,就没有这种效果。我试着玩密度,摩擦。也没有阻尼 我在谷歌上搜索了所有可能出现的与跳跃、跌倒和速度有关的box2d问题。什么也找不到 下面是角色移动的代码。重力为20,时间步长为1/15 public class HeroModel extends Ga

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

}
公共类HeroModel扩展了GameObjectModel
{
公共变量:布尔值=false;
public-var-isAlive:Boolean=true;
公共航空货运公司:b2Vec2;
公共var递减力:数字=-200;
公共var递减力X:数值=100;
公共var startPos:点;
公共变量跳跃:数字=1;
公共函数模型()
{
超级();
}
重写公共函数initFrom(initObj:Object,world:b2World):void
{
super.initFrom(initObj,world);
var filterdata:b2FilterData=新的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(真);
应用forwardforce();
physicsBody.SetUserData(此);
startPos=新点(this.physicsBody.GetPosition().x,this.physicsBody.GetPosition().y);
}
公共函数die():void
{
//TODO空函数。?
}
公共函数applyForwardForce():void
{
forwardForce=新的b2Vec2(200,0);
physicsBody.ApplyForce(forwardForce,新b2Vec2(0,0));
}
公共函数跳转(e:EnterFrameEvent):无效
{
如果(减小力<0和减小力>75)
{
physicsBody.ApplyImpulse(新b2Vec2(衰减力X,衰减力Y),新b2Vec2(0,0));
衰减力+=5;
减小力x-=2.5;
}
}
公共函数resetVelocity():void
{
减小力x=100;
递减力=-200;
}
}

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

你知道我哪里弄错了吗?:)

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


Box2D必须与scalefactor配合使用,其测量单位为米,因此100x100对象是一座大建筑。

我使用SetLinearVelocity修复了它,现在一切正常。:)


我喜欢你的逻辑,我现在正在玩弄它。我想到了其他一些事情。我尝试将hero设置为1x1像素,但没有任何改变。我猜那是因为我用龙骨来扮演这个角色。然后我尝试直接使用以下代码设置质量
var massData=new b2MassData();physicsBody.GetMassData(massData);massData.mass=20.0//或其他;physicsBody.SetMassData(massData)我能感觉到质量在变化,但我还是受到了不良影响。现在,我将尝试您建议的比例因子。我不明白:D我是作者,我只是说,我没有使用ApplyImpuse,而是发现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;