Java игра: враги и пауза — урок 6

В этом уроке мы добавим в игру врагов, которые будут двигаться к игроку, и реализуем систему паузы.

Добавление врагов

Реализация системы врагов достаточно проста. Враги будут появляться за экраном, двигаться к игроку, и при столкновении с ним игра будет считаться проигранной. Игрок должен перепрыгивать врагов.

Добавим картинку врага в папку images проекта. Используйте любую картинку или скачайте её с сайта it-proger.com (ссылка на картинку в описании).

Далее, добавим или используем существующий ImageView. Уменьшим размер изображения для удобства перепрыгивания и разместим его на экране. Назначим ему ID enemy.

В коде создадим переменную, ссылающуюся на этот ImageView:

ImageView enemy = findViewById(R.id.enemy);

Для перемещения картинки используем код, аналогичный тому, что использовался ранее. Создадим объект анимации enemyTransition. Установим скорость анимации (например, 3.5 секунды).

Чтобы анимация врага не ждала завершения других анимаций и враг появлялся заново после выхода за экран, используем setCycleCount с бесконечным значением и запустим анимацию вручную:

enemyTransition.setCycleCount(Animation.INFINITE);
enemyTransition.start();

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

Реализация системы паузы

Добавим систему паузы, активирующуюся при нажатии клавиши Escape.

В Scene Builder добавим Label с текстом «Пауза». Изменим шрифт, размер (например, 64) и выровняем по центру. Снимем флажки Visible (чтобы надпись не отображалась изначально) и Focus Traversal. Добавим ID pauseLabel.

В коде создадим переменную, ссылающуюся на этот Label:

Label pauseLabel = findViewById(R.id.pauseLabel);

Создадим статическую переменную isPaused со значением false для отслеживания состояния паузы.

В таймере добавим условия:

if (isPaused && !pauseLabel.isVisible()) {
    pauseLabel.setVisible(true);
} else if (!isPaused && pauseLabel.isVisible()) {
    pauseLabel.setVisible(false);
}

В обработчике onKeyUp для клавиши Escape будем изменять значение isPaused:

isPaused = !isPaused;

Для полной остановки игры при паузе обнулим скорости игрока (playerSpeed, jumpDownSpeed) и приостановим анимации:

playerSpeed = 0;
jumpDownSpeed = 0;
parallelTransition.pause();
enemyTransition.pause();

При возобновлении игры восстановим скорости и запустим анимации:

playerSpeed = 3;
jumpDownSpeed = 5;
parallelTransition.play();
enemyTransition.play();

Теперь при нажатии Escape игра будет ставиться на паузу, а при повторном нажатии — возобновляться. Пауза работает даже во время прыжка.

В этом уроке мы добавили в игру врагов и реализовали систему паузы. В следующих уроках продолжим работу над игрой.

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