【发布时间】:2010-04-05 02:49:55
【问题描述】:
我想我已经将 Box2d 配置为对任何物体都有某种最大速度,但我不确定。我施加像(100000000, 100000000) 这样的冲动,身体移动的速度和(100, 100) 一样快——根本没有那么快。
我正在使用 Box2d XNA C# 端口。
我的游戏是自上而下的 2d。
以下是一些可能相关的代码:
private readonly Vector2 GRAVITY = new Vector2(0, 0);
public void initializePhysics(ContactReporter contactReporter)
{
world = new World(GRAVITY, true);
IContactListener contactListener = contactReporter;
world.ContactListener = contactListener;
}
public void Update(GameTime gameTime)
{
// ...
worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10);
//...
}
下面是一些应用脉冲的示例代码:
private void ApplyImpulseFromInput()
{
Vector2 movementImpulse = new Vector2();
if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f)
{
movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT;
} else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f)
{
movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ;
}
if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f)
{
movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ;
} else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f)
{
movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ;
}
model.Body.ApplyImpulse(movementImpulse, model.Position);
}
如果Constants.PLAYER_IMPULSE_CONSTANT 是从1000f 到1000000000f 的任意位置,则玩家最多可以移动(-120, -120) 到(120, 120)。如果常量越小,例如1f,玩家的移动速度就会越慢。
此代码用于为游戏世界中的所有内容设置物理:
controller.Model.BodyDef = new BodyDef();
controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static;
controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef);
controller.Model.Body.SetLinearDamping(10.0f);
可能是线性阻尼吗?我把10.0f改成了0,没有效果。
更新: 线性阻尼的奇怪之处:我对使用上述应用脉冲方法移动的身体进行了这些观察:
Linear Damping Max Speed
0f 120
10f 120
50f 120
55f 90
60f 0
70f 0
100f 0
100000f 0
为什么在50f 和60f 之间存在线性阻尼的灵敏度范围?
【问题讨论】:
-
应用冲动的代码可能有用。
-
+1 以抵消投票否决的人。这是一个合理的问题。