Всё как на старых приставках.
Арканоид — классическая компьютерная игра. Сегодня мы её воссоздадим.
Суть игры такая:
- сверху игрового поля стоят несколько рядов кирпичей;
- по полю движется шарик, который при касании убирает кирпич и отскакивает в противоположную сторону;
- от стен и верха шарик тоже отскакивает;
- внизу есть подвижная платформа, как ракетка;
- чтобы шарик не упал вниз, игрок двигает платформу влево или вправо, подставляя её под шарик;
- если шарик падает мимо платформы — игра останавливается или заканчивается совсем, смотря как запрограммировать;
- цель игры — сбить все кирпичи и не дать шарику упасть.
Мы сделаем свою версию с такой же механикой, но с некоторыми отличиями. А в следующих проектах добавим сложности и новые возможности для игры. За основу возьмём код программиста Stalker с гитхаба .
Логика игры
Если вы видели наш проект с пинг-понгом , то многое вам будет уже знакомо. Например, механика проверки на касание объектов, покадровая отрисовка игры и отскок шарика со сменой направления — всё это мы уже делали в той игре.
Чтобы было понятно, в какой последовательности мы пишем код, вот общая структура:
- Готовим страницу и рисуем на ней игровое поле. Всё остальное будет происходить в скрипте.
- Заводим переменные, которые будут отвечать за наполнение уровня, цвет и размер всех игровых элементов.
- Сразу помещаем всё, что относится к кирпичам, в одну большую переменную, с которой будем работать всю игру.
- Добавляем функцию проверки на касание объектов — вся игра будет строиться на ней.
- Делаем главный цикл игры, в котором по очереди сдвигаем все объекты, которые движутся, и убираем те кирпичи, которые нужно убрать. Каждый кадр всё будет отрисовываться заново, чтобы был эффект непрерывного движения.
Готовим страницу
Единственное, что нам здесь понадобится, — сделать стилями чёрный фон, чтобы цветные кирпичи смотрелись на нём эффектнее. Всё остальное берём из шаблона пустой страницы. Пока что на экране будет чернота, рисовать будем дальше.
Переменные
Для игры нам понадобятся две основные переменные (помимо всяких вспомогательных).
Первая переменная отвечает за дизайн уровня — это двумерный массив, где каждая строка отвечает за свой ряд кирпичей. Сами кирпичи сразу обозначаются буквами, которые отвечают за их цвет. Если кирпичей нет, то ряд пустой и там ничего рисоваться не будет. Меняем эту переменную — меняется и внешний вид уровня. В будущем этой переменной может быть много дизайнов уровней.
Вторая переменная — одномерный массив, в котором хранится вся информация обо всех кирпичах: координаты, цвет и размеры каждого кирпича. Именно с этой переменной мы и будем работать всю игру — в самом начале поместим туда все кирпичи из переменной с дизайном, а потом будем убирать их оттуда при касании шарика.
Проверка на касание объектов
Это настолько востребованная функция у разработчиков игр, что проще взять уже готовую, чем писать самому с нуля. В проекте используется функция с сайта Mozilla для разработчиков :
Отслеживаем нажатия на клавиши
Чтобы игрок мог управлять движением платформы, добавим обработчик нажатий на клавиши.
Стрелки влево и вправо двигают платформу в стороны, а пробел запускает шарик, если он не движется. Как только игрок отпускает стрелки, платформа перестаёт двигаться.
Главный цикл игры
Вся игра — это один большой цикл, где каждое новое положение элементов отрисовывается в новом кадре. Последовательность действий будет такая:
- Очищаем игровое поле
- Сдвигаем платформу, если было нажатие на стрелки, и следим, чтобы она не улетела за границы стен.
- Двигаем шарик со своей скоростью и направлением и смотрим, чтобы он отскакивал от стен и верхней границы.
- Если шарик упадёт вниз мимо платформы-ракетки — помещаем его на стартовую позицию и останавливаем, пока не игрок не нажмёт пробел.
- Если шарик коснулся платформы — делаем отскок в противоположную сторону.
- Когда шарик коснётся кирпича — тоже делаем отскок и сразу убираем этот кирпич.
- И только в самом конце мы отрисовываем все игровые элементы на своих новых позициях.
Запускаем игру
Для запуска достаточно одной команды в самом конце скрипта:
requestAnimationFrame(loop);
Вот теперь мы видим всю красоту:
Можно посмотреть, как это работает на странице проекта .
Готовый код игры
Что дальше
Сейчас у этой игры много проблем:
- платформа маленькая, и ловить шарик сложно;
- нет усложнения по ходу игры;
- нет подсчёта очков;
- у игрока бесконечное количество жизней — возможностей уронить шарик;
- только один уровень;
- нет бонусных кирпичей, которые дают новые возможности или больше очков.
Что-то из этого исправим в следующих версиях.