如何在JavaFX中处理多个并发动画

时间:2019-06-27 06:13:50

标签: animation javafx-11

我正在使用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);

使用此技术并不能偶尔阻止不良行为。 有没有更好的方法来实现此问题或解决此问题。

0 个答案:

没有答案