每隔几秒平铺一次

Tile movement every number of seconds

我有如下所示的更新方法:

@Override
public void update(Input input, int delta) {

    /* if UP, move player 5 tiles upwards */
    if (input.isKeyPressed(Input.KEY_UP) {
        y -= 5;
        setY(y);
    }

    /* if DOWN, move player 5 tiles downwards */
    if (input.isKeyPressed(Input.KEY_DOWN) {
        y += 5;
        setY(y);
    }

    /* if LEFT, move player 5 tiles to the left */
    if (input.isKeyPressed(Input.KEY_LEFT) {
        x -= 5;
        setX(x);
    }

    /* if RIGHT, move player 5 tiles to the right */
    if (input.isKeyPressed(Input.KEY_RIGHT) {
        x += 5;
        setX(x);  
    }
}

我的世界更新循环class:

public void update(Input input, int delta) 
throws SlickException {

    // Update every sprite eg. Player, Blocks etc.
    for (Sprite sprite : list) {
        sprite.update(input, delta);
    }  
}

其中 setX()setY() 只是我的 class 中的设置器,它们处理玩家应该移动多少像素(以图块为单位)。每个图块为 32 像素。

到目前为止,这会将我的播放器从一个位置移动到另一个位置,向下、向上、向左或向右 5 个方块。我想知道他们是否是一种让玩家每 0.25 秒移动一个瓷砖到目的地的方法?例如,每 0.25 秒,玩家将在左、右、下或上方向移动 32 个像素。我想添加这个,这样看起来玩家正在滑过瓷砖而不是直接传送到它的位置。

我如何使用计时器来实现这一点?我可以使用 delta 来做到这一点吗?任何形式的帮助将不胜感激。

在包含时间戳的更新循环之外保留一个变量。

int lastTimestamp;

现在,在您的循环中,创建一个条件检查自 lastTimetamp.

中的时间以来是否已过去 250 毫秒
// Use System.nanoTime() / 1000000L to get current time
if(currentTime >= (lastTimestamp + 250)) {
   movePlayer();
   lastTimestamp = currentTime;
}

现在这种情况应该每 0.25 秒通过一次。

我会添加一个 Runnable class MoveAnimation 你给 ScheduledExecutorService.

class MoveAnimation { // the full player movement
    public boolean animationFinished();
    public void animate() {
        if (animationFinished()) {
            throw new Exception(); // there is probably a cleaner way to remove this from the executor
        }
    }
}

class AnimationControl {
    private final ScheduledExecutorService animationSchedule = Executors.newScheduledThreadPool(1);
    public void addMovement(MoveAnimation animation) {
        animationSchedule.scheduleAtFixedRate(animation::animate, 0, 250, TimeUnit.MILLISECONDS);
    }
}

// in the event listener
if (input.keyIsPressed(Input.KEY_LEFT)) {
    animationControl.addMovement(new MoveLeftAnimation(from, to));
}

看到这个答案:

Java slick2d moving an object every x seconds

你绝对应该为此使用 delta,因为你想要 framerate independent motion 在你的游戏中。