Java игра: программирование игрока, прыжки и движение

Этот урок посвящен программированию основного игрока, его передвижению и прыжкам. Для этого потребуются новые переменные.

Создание переменных

Создадим статические булевы переменные 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) для скорости падения.

В этом уроке реализован основной игрок, способный двигаться влево и вправо, а также прыгать. Управление осуществляется с помощью клавиатуры, ограничения предотвращают выход за пределы экрана. В дальнейшем можно улучшить механику прыжка и добавить другие функции.

Что будем искать? Например,программа