null
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (1/23)
Сегодня мы предлагаем тебе написать увлекательную игру — Moon Lander. Как всегда, начнем с правил.
Цель – опустить посадочный модуль на лунную поверхность. Для этого игроку нужно преодолеть притяжение Луны,
используя кормовой ускоритель для замедления падения и боковые ускорители для перемещения ко
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (2/23)
На данном этапе давай создадим метод drawScene(), который будет отвечать за отрисовку игрового поля.
Сперва в этом методе мы будем окрашивать все ячейки игрового поля в один цвет.
Также нам понадобится метод createGame(),отвечающий за создание игры.
Для начала мы будем вызывать в нем только метод о
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (3/23)
Так как в Moon Lander будут использоваться игровые объекты, давай создадим класс GameObject, в который вынесем
их общие характеристики. На данном этапе это координаты x и y.
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (4/23)
Кроме координат, у игрового объекта будет матрица, отвечающая за внешний вид. Давай добавим в класс GameObject
переменную matrix типа int[][] для ее хранения. А теперь займемся посадочным лунным модулем.
Для простоты будем называть его просто ракетой. Создадим класс Rocket, наследуемый от класса Ga
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (5/23)
Мы будем часто пользоваться такими параметрами как ширина и высота игрового объекта. Следовательно, вынесем их в
отдельные переменные класса GameObject. Чтобы объект мог отрисовываться на игровом поле, добавим ему метод draw.
Этот метод будет принимать в качестве параметра объект класса Game. Тепер
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (6/23)
Ракета у нас уже есть, теперь займемся отрисовкой ландшафта. Его матрицу мы сделали для тебя: ты ее найдешь
в классе ShapeMatrix. Ландшафт — это тоже игровой объект, поэтому создадим метод, который будет отвечать за инициализацию подобных объектов.
В нем будут создаваться ландшафт и ракета.
Как ты
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (7/23)
Давай займемся реализацией движения ракеты. Для начала создадим метод move() и в нем реализуем свободное падение.
Падение должно происходить с ускорением, то есть нам нужно постоянно увеличивать его скорость. За скорость движения
по оси Y будет отвечать переменная speedY, а увеличивать ее на каждом
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (8/23)
Продолжим реализовывать движение ракеты. Давай добавим поля, которые будут ответственны за состояние клавиш,
благодаря которым мы перемещаем ракету по экрану. Эти поля будут принимать только два значения: true, если клавиша нажата, иначе false.
Для управления ракетой нам понадобится всего три клави
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (9/23)
На этом этапе займемся реализацией методов onKeyPress и onKeyReleased. Как ты мог понять из названия, метод onKeyPress
вызывается при нажатии любой клавиши, а метод onKeyReleased при отпускании. Перейдем к реализации метода onKeyPress. Он должен
обрабатывать нажатия клавиш вверх, влево и вправо и в
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (10/23)
Продолжим реализацию движения ракеты. Она должна двигаться и по вертикали, и по горизонтали.
Давай внесем соответствующие изменения в метод move: теперь он будет принимать в качестве параметров состояния
нажатия клавиш. Первый параметр — это isUpPressed, второй — isLeftPressed, третий — isRightPres
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (11/23)
На данный момент ракета может улетать за пределы игрового поля. Давай это исправим. Создадим специальный метод, в котором будем
проверять достижение ракетой границ экрана: левой, правой и верхней. Если ракета достигает одну из указанных границ, возвращаем
ее в пределы игрового поля. Этот метод нужн
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (12/23)
Как ты заметил, после отпускания клавиши движения влево или вправо ракета сразу прекращает движение, а нужно
чтобы она продолжала движение по инерции. Чтобы реализовать это, будем использовать переменную slowdown,
которая отвечает за замедление ракеты. Если мы отпускаем клавиши движения вправо или
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (13/23)
Сейчас мы объявим несколько методов, которые пригодятся нам в будущем.
Метод check будет проверять пересечение координат ракеты и ландшафта.
Методы win и gameOver будут отвечать за выигрыш и проигрыш соответственно.
Метод isStopped будет проверять "мягкость" посадки. Если ракета слишком быстро приз
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (14/23)
Для удобства проверки приземления ракеты создадим платформу(GameObject platform). При инициализации в качестве матрицы передай
ShapeMatrix.PLATFORM — ее мы добавили в класс ShapeMatrix. Теперь реализуем метод check. Он будет вызывать метод win или
gameOver в зависимости от ситуации. Когда будешь пи
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (15/23)
Создадим метод land, который будет отвечать за приземление ракеты. Так как приземлением считается пересечение
ракеты и платформы, для корректного отображения нам нужно поднять ракету на одну позицию вверх, чтобы она не "наезжала"
на платформу. Еще нам понадобится специальное поле, которое будет отв
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (16/23)
Займемся методом, отвечающим за крушение ракеты при ее пересечении с ландшафтом. Этот метод будет менять внешнее
отображение ракеты путем замены ее матрицы (матрицу ты найдешь в классе ShapeMatrix). Теперь реализуем метод gameOver.
Он должен вызвать метод crash у ракеты, показать сообщение о проигр
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (17/23)
Пришла пора реализовать реактивную тягу ракеты. На этом этапе создадим класс RocketFire, который будет отвечать
за отрисовку и анимирование огня выхлопа. Список матриц шагов анимаций будет храниться в его переменной frames типа List.
Переменная frameIndex будет хранить индекс текущей матрицы-анимац
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (18/23)
Продолжаем реализацию реактивной тяги. На этом этапе в класс Rocket мы добавим переменные, которые описывают
правую, левую и нижнюю тяги. Заполним эти поля в конструкторе соответствующими матрицами из класса ShapeMatrix,
которые мы подготовили заранее.
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (19/23)
На этом этапе мы будем дорабатывать отображение анимации реактивной тяги. Добавим и реализуем метод nextFrame(), который
будет переключать кадры для создания анимации (устанавливать текущую матрицу из frames в переменную matrix).
Также переопределим метод draw, который будет менять кадр для анимаци
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (20/23)
На данном этапе мы отрисуем нашу первую анимацию. Нам понадобятся методы show и hide, которые будут отвечать
за отображение и скрытие реактивной тяги, а также метод switchFire который будет задавать координаты тяги и вызывать
методы show и hide в зависимости от переданного параметра. Чтобы реактивн
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (21/23)
Чтобы полностью реализовать анимацию, необходимо в методе switchFire учесть наличие боковых огней.
Поэтому в параметры существующего метода switchFire добавим переменные, отвечающие за нажатие клавиш движения в стороны,
т.е. первым параметром метода будет isUpPressed, вторым — isLeftPressed, третьи
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (22/23)
Игра занимательная, но все-таки здорово было бы добавить счет очков. Очки мы будем считать по такому принципу: чем быстрее посадил
ракету, тем меньше игровых очков это стоило. Поэтому мы будем уменьшать количество очков с течением времени (на каждом шаге игры), пока
не достигнем 0. Для подсчета очк
3
Задача
Games,
0 уровень,
4 лекция
Недоступна
Игра Moon Lander (23/23)
Поздравляю! Игра написана. Теперь можно в нее поиграть!
Если есть время и вдохновение, можешь улучшить игру, добавив некоторые "фичи" от себя. Например:
• усложнить или упростить игру, изменив ландшафт (например, добавив туннель);
• сделать несколько ландшафтов/уровней;
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ