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