[英]How can I find my issue with limiting my speed for my Java game?
我目前正在制作一款游戏,您可以驾驶一辆坦克,并且目前正在参加玩家课程。 我希望战车能有一点点实际动作的惯性。 我有一个问题,我的油箱速度没有达到我设定的极限。 据我所知,角速度部分的效果很好。 两个块使用相同的逻辑。 现在,每次您向后/向前单击时,油箱速度将从1.6开始最大,然后在2和3之间,然后在5和6之间。
这是代码:
final class Player extends GameObject {
private static final double ANGLE_VELOCITY_MAX = Math.PI / 60, ANGLE_VELOCITY_STEP = Math.PI / 900,
ACCELERATION_STEP = .1, ACCELERATION_MAX = 1;
private double angle = 0, angleVelocity = 0, speed = 0, acceleration = 0;
@Override
public final void tick() {
if (gc.getKey(KeyEvent.VK_W) && speed < ACCELERATION_MAX)
if (acceleration + ACCELERATION_STEP > ACCELERATION_MAX)
acceleration = ACCELERATION_MAX;
else
acceleration += ACCELERATION_STEP;
else if (gc.getKey(KeyEvent.VK_S) && speed > -ACCELERATION_MAX)
if (acceleration - ACCELERATION_STEP < -ACCELERATION_MAX)
acceleration = -ACCELERATION_MAX;
else
acceleration -= ACCELERATION_STEP;
else if (Math.abs(acceleration) < ACCELERATION_STEP)
acceleration = 0;
else
acceleration -= Math.signum(acceleration) * ACCELERATION_STEP;
if (gc.getKey(KeyEvent.VK_D) && angleVelocity < ANGLE_VELOCITY_MAX)
if (angleVelocity + ANGLE_VELOCITY_STEP > ANGLE_VELOCITY_MAX)
angleVelocity = ANGLE_VELOCITY_MAX;
else
angleVelocity += ANGLE_VELOCITY_STEP;
else if (gc.getKey(KeyEvent.VK_A) && angleVelocity > -ANGLE_VELOCITY_MAX)
if (angleVelocity - ANGLE_VELOCITY_STEP < -ANGLE_VELOCITY_MAX)
angleVelocity = -ANGLE_VELOCITY_MAX;
else
angleVelocity -= ANGLE_VELOCITY_STEP;
else if (Math.abs(angleVelocity) < ANGLE_VELOCITY_STEP)
angleVelocity = 0;
else
angleVelocity -= Math.signum(angleVelocity) * ANGLE_VELOCITY_STEP;
if (--treadCooldown <= 0) {
if (++treadIndex >= treads.length)
treadIndex = 0;
treadCooldown = TREAD_COOLDOWN;
}
angle += angleVelocity;
speed += acceleration;
location.translate(Math.cos(angle) * speed, Math.sin(angle) * speed);
}
我的猜测是,您应该引入一些独立于ACCELERATION_MAX
speed
, if
s编辑为:
if (gc.getKey(KeyEvent.VK_W) && acceleration < ACCELERATION_MAX)
...
else if (gc.getKey(KeyEvent.VK_S) && acceleration > -ACCELERATION_MAX)
...
最后确保speed
在可接受的范围内。
BTW:
我必须承认您的上述代码对我来说真的很难阅读(更不用说理由了)-我建议将其重组为:
@Override
public final void tick() {
if (gc.getKey(KeyEvent.VK_W)) accelerate(ACCELERATION_STEP);
else if (gc.getKey(KeyEvent.VK_S)) accelerate(-ACCELERATION_STEP);
else accelerate(- Math.signum(acceleration) * ACCELERATION_STEP);
// etc.. you get the idea
}
private void accelerate(double delta) {
setAcceleration(acceleration +delta);
}
private void setAcceleration(double value) {
acceleration = roundToZero(constrain(value, -ACCELERATION_MAX, ACCELERATION_MAX), ACCELERATION_STEP);
}
private static double constrain(double value, double min, double max) {
return value > max ? max : (value < min ? min : value);
}
private static double roundToZero(double value, double radius) {
return Math.abs(value) < radius ? 0 : value;
}
免责声明:未测试以上内容,也未尝试对其进行编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.