我正在使用JavaFX11实现Pacman。从逻辑上讲,Pacman视图分为单元格网格,并且重影从当前单元格移动到下一个单元格。我正在使用Transition和PauseTransition移动幽灵。由于这些都是在单独的线程中运行的,因此有时会出现鬼影。以下是我用来移动鬼影的代码的一部分。
private void moveGhostRight(Ghost ghost) {
Duration duration = ghost==Ghost.BLINKY&&blinkySpeedUp?
Duration.millis(200): Duration.millis(250);
GhostMoveTransition moveTransition = new
GhostMoveTransition(duration, Direction.RIGHT, ghost);
ghost.addTransition(moveTransition);
moveTransition.setOnFinished(e->{
ghost.setLocation(Direction.RIGHT);
ghost.removeTransition(moveTransition);
testUserCapture(ghost);
ghost.setOnTheMove(false);
determineDirectionAndMove(ghost);
});
moveTransition.play();
}
GhostTransition是从Transition扩展的类。仅当重影从一侧移动到另一侧的末端时才使用PauseTransition。用于移动重影的过渡保存在单独的队列中,并在必须停止重影移动时使用这些队列。
我最初使用计时器并进行过渡以移动重影。但是后来我找到了更好的方法。每次过渡结束时,我都调用defineDirectionAndMove(ghost)开始下一个过渡。
当前,大多数情况下,游戏运行良好。但是偶尔会出现鬼动作(进入错误的单元格,例如代表迷宫边界的单元格,甚至对角线)。 我很确定运动算法本身没有问题。
为解决此类问题,我定义了一个布尔变量,以便在上一次对确定方向AndMove的调用全部完成之前,将阻塞defineDirectionAndMove方法。
public void determineDirectionAndMove(Ghost ghost) {
while(ghost.onTheMove()) {};
ghost.setOnTheMove(true);
使用此技术并不能偶尔阻止不良行为。 有没有更好的方法来实现此问题或解决此问题。