在平台游戏中掉落时具有 box2d 怪异效果的 AS3
AS3 with box2d weird effect during falling in a platformer game
我正在使用 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;
}
}
这是游戏截图。红色的是发生了什么,绿色的是我想要的。
有什么想法我错了吗? :)
20的重力大(8或9更自然)。您描述的 motion/reaction 符合应用于公共汽车或大卡车等大物体的重力。我猜你的角色实际上可能和公共汽车或卡车一样大。由于我在您的代码中没有看到任何地方使用比例因子,这似乎是一个很好的假设。跳过比例因子可能会使一切变得更简单,但它不能使您的模拟逼真。
Box2D 必须与比例因子一起使用,它的测量单位是米,所以 100x100 的物体就是一座大建筑物。
我使用 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;
我正在使用 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;
}
}
这是游戏截图。红色的是发生了什么,绿色的是我想要的。
有什么想法我错了吗? :)
20的重力大(8或9更自然)。您描述的 motion/reaction 符合应用于公共汽车或大卡车等大物体的重力。我猜你的角色实际上可能和公共汽车或卡车一样大。由于我在您的代码中没有看到任何地方使用比例因子,这似乎是一个很好的假设。跳过比例因子可能会使一切变得更简单,但它不能使您的模拟逼真。
Box2D 必须与比例因子一起使用,它的测量单位是米,所以 100x100 的物体就是一座大建筑物。
我使用 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;