Как работать с несколькими одновременными анимациями в JavaFX - PullRequest
0 голосов
/ 27 июня 2019

Я реализую Pacman, используя JavaFX11.Представление 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), чтобы начать следующий переход.

В настоящее время большую часть времени игра работает отлично.Но иногда призрак плохо себя ведет (переходите в неправильную ячейку, такую ​​как ячейка, представляющая границу лабиринта, или даже идет по диагонали).Я почти уверен, что нет проблем с самим алгоритмом перемещения.

Чтобы решить эту проблему, я определил логическую переменную так, чтобы метод defineDirectionAndMove блокировался до тех пор, пока все предыдущие вызовы defineDirectionAndMove не будут завершены.

public void determineDirectionAndMove(Ghost ghost) {
    while(ghost.onTheMove()) {};
    ghost.setOnTheMove(true);

Использование этой техники не останавливает иногда плохое поведение.Есть ли лучший способ реализовать эту проблему или решить эту проблему.

...