繁体   English   中英

如何限制我的Java游戏速度来解决问题?

[英]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 speedif 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM