private void move(int deltaTime) {
double secondsElapsed = (deltaTime / 1000.0);// seconds since last update
double speed = velocity.magnitude();
double magnitude = 0;
if (up)
magnitude = 100.0;
if (down)
magnitude = -100.0;
if (right)
direction += rotationSpeed * (speed/topspeed);// * secondsElapsed;
if (left)
direction -= rotationSpeed * (speed/topspeed);// * secondsElapsed;
double dir = Math.toRadians(direction - 90);
acceleration = new Vector2D(magnitude * Math.cos(dir), magnitude * Math.sin(dir));
Vector2D deltaA = acceleration.scale(secondsElapsed);
velocity = velocity.add(deltaA);
if (speed < 1.5 && speed != 0)
velocity.setLength(0);
Vector2D deltaP = velocity.scale(secondsElapsed);
position = position.add(deltaP);
...
}
我的向量类模拟了基本的向量运算,包括加减法、标量乘法等等。
为了重申底层问题——当大小为0时,magnitude * Math.cos(dir) = 0,因此当玩家只按下左右箭头键而没有“加速”方向时,方向不会改变。
如果有人需要更多信息,可以在http://www.java-gaming.org/index.php/topic,23930.0.html上找到。
if (speed < 1.5 && speed != 0) velocity.setLength(0);
?关于使用箭头键进行加速:当速度减小时,旋转速度增加,我觉得这很尴尬。无论如何,最简单的方法是在按左或右键时旋转速度向量以固定方向。如果你想让它更“物理化”,考虑使用角动量,但不要太花哨。 - user694971