Я реализую 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);
Использование этой техники не останавливает иногда плохое поведение.Есть ли лучший способ реализовать эту проблему или решить эту проблему.