每隔几秒平铺一次
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 在你的游戏中。
我有如下所示的更新方法:
@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 在你的游戏中。