В этом уроке мы добавим в игру врагов, которые будут двигаться к игроку, и реализуем систему паузы.
Добавление врагов
Реализация системы врагов достаточно проста. Враги будут появляться за экраном, двигаться к игроку, и при столкновении с ним игра будет считаться проигранной. Игрок должен перепрыгивать врагов.
Добавим картинку врага в папку 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 игра будет ставиться на паузу, а при повторном нажатии — возобновляться. Пауза работает даже во время прыжка.
В этом уроке мы добавили в игру врагов и реализовали систему паузы. В следующих уроках продолжим работу над игрой.