Этот урок посвящен программированию основного игрока, его передвижению и прыжкам. Для этого потребуются новые переменные.
Создание переменных
Создадим статические булевы переменные Right и Left (со значениями false), хранящие информацию о нажатии соответствующих клавиш. Доступ к ним осуществляется напрямую через имя класса, поскольку они объявлены как статические. Также создадим переменную playerSpeed (со значением 3) для скорости игрока.
public static boolean Right = false;
public static boolean Left = false;
int playerSpeed = 3;
Обработка игрового цикла
Используем AnimationTimer для выполнения кода каждый кадр игры. Метод handle вызывается постоянно, а initialize – один раз при запуске.
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
// Код, выполняемый каждый кадр
}
};
Обработка нажатий клавиш
В методе handle обрабатываем переменные Right и Left. Если Right – true, изменяем координату X игрока, вычитая playerSpeed из текущей позиции. Для левого движения добавляем playerSpeed.
@Override
public void handle(long now) {
if (Right) {
player.setLayoutX(player.getLayoutX() - playerSpeed);
}
if (Left) {
player.setLayoutX(player.getLayoutX() + playerSpeed);
}
}
Запускаем таймер в методе initialize:
timer.start();
В основном классе отслеживаем нажатия клавиш, используя объект, связанный с текущей сценой. setOnKeyPressed создает обработчик, вызываемый при нажатии клавиши. event.getCode() возвращает код нажатой клавиши.
scene.setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.A) {
HelloController.Left = true;
}
if (event.getCode() == KeyCode.D) {
HelloController.Right = true;
}
// ... обработка других клавиш
});
Аналогично, setOnKeyReleased обрабатывает отпускание клавиш:
scene.setOnKeyReleased(event -> {
if (event.getCode() == KeyCode.A) {
HelloController.Left = false;
}
if (event.getCode() == KeyCode.D) {
HelloController.Right = false;
}
// ... обработка других клавиш
});
Переменные Right и Left объявлены как public для доступа из других классов.
Добавление ограничений движения
Чтобы игрок не выходил за пределы экрана, добавим ограничения в метод handle:
@Override
public void handle(long now) {
if (Right) {
player.setLayoutX(Math.min(player.getLayoutX() - playerSpeed, 100)); // Ограничение справа
}
if (Left) {
player.setLayoutX(Math.max(player.getLayoutX() + playerSpeed, 28)); // Ограничение слева
}
// ... остальной код
}
Реализация прыжка
Создадим переменную Jump (изначально false). В основном классе добавим обработчик для клавиши пробела:
scene.setOnKeyPressed(event -> {
// ... предыдущий код
if (event.getCode() == KeyCode.SPACE && !HelloController.Jump) {
HelloController.Jump = true;
}
});
В методе handle добавим обработку прыжка:
@Override
public void handle(long now) {
// ... предыдущий код
if (Jump) {
player.setLayoutY(player.getLayoutY() - playerSpeed);
if (player.getLayoutY() <= 90) {
Jump = false;
}
} else if (player.getLayoutY() > 181) {
player.setLayoutY(player.getLayoutY() + jumpDownSpeed);
Jump = false;
}
}
Добавим переменную jumpDownSpeed (например, 5) для скорости падения.
В этом уроке реализован основной игрок, способный двигаться влево и вправо, а также прыгать. Управление осуществляется с помощью клавиатуры, ограничения предотвращают выход за пределы экрана. В дальнейшем можно улучшить механику прыжка и добавить другие функции.