Проект Nano Dungeon

Проект этой книги - небольшая игра в жанре Roguelike, которую мы называем Nano Dungeon (Нано подземелье). Эта простая игра разработана так, чтобы ее можно было легко расширять и проводить исследования в работе roguelike. Важно понимать, что мы создадим шаблонный рогалик. Мы не стремимся к инновационым механике или игровому процессу — они придут к вам позже, когда вы продвинетесь в своем личном путешествии по разработке игр. Nano Dungeon — это скорее упражнение, позволяющее нам попрактиковаться в создании рогаликов. Наша игра будет на фэнтезийную тематику, в которой игрок будет проходить несколько процедурно сгенерированных уровней подземелий, сражаясь с монстрами и приобретая предметы, пока не найдет волшебный предмет на самом глубоком уровне подземелья. Мы будем строить эту игру медленно. Мы начнем вообще без какой-либо процедурной генерации, а позже добавим и поэкспериментируем с процедурной генерацией.

Основные характеристики игры в жанре roguelike:

  • Процедурно сгенерированный контент
  • Перманентная смерть
  • Пошаговое действие

Итак, помня об этом, давайте начнем с настройки нашего компьютера.

Настройка

Для Nano Dungeon мы будем использовать очень простую настройку. Это сделано намеренно, чтобы мы могли сосредоточиться на игре, а не на бесконечном количестве вариантов инструментов, доступных разработчикам JS.

Наша главная цель настройки — сделать так, чтобы она не мешала нам и была невидимой, пока мы создаем игру.

Установка веб-сервера

Вам необходимо установить Node.js, чтобы иметь возможность установить веб-сервер, используемый в этой книге. Мы будем использовать версию с долгосрочной поддержкой (Long Term Support - LTS). Phaser на самом деле не требует Node.js, и наши примеры из книги не будут использовать его напрямую. Вам просто нужно установить крошечный веб-сервер, чтобы вы могли запускать примеры.

Большинство игровых веб-проектов будут использовать Node.js для создания и трансляции игры. Транспилирование (компиляция JS-кода в новом стандарте в JS-код старого стандарта) позволяет разработчикам работать с передовыми функциями JS, сохраняя при этом возможность развертывания в большинстве браузеров. Node.js обычно используется для упаковки финальной поставляемой версии игры в файлы меньшего размера для более эффективного развертывания. В этой книге мы не будем делать ничего из этого, поскольку выбор инструментов для выполнения этих задач зависит не только от вкуса каждого разработчика, но и от конкретных требований каждого проекта.

Используя Node.js в качестве веб-сервера и написав JS, который развертывается и выполняется в браузере точно так, как мы его написали, будет легче отлаживать наш исходный код и взаимодействовать с ним. Еще одно преимущество этого подхода состоит в том, что вам не нужно будет изучать новые инструменты, чтобы выполнять примеры из этой книги. Примеры кода в этой книге просты и с ними легко экспериментировать. Мы думаем, что, не имея других инструментов, кроме редактора, браузера и веб-сервера, мы сократим усилия, которые вам потребуются для тестирования кода.

Вы можете проверить правильность установки Node.js, открыв терминал и выполнив:

$ node -v

Он должен вернуть версию установленного Node.js, например v14.16.0. Убедившись, что Node.js установлен, проверьте, установлен ли также NPM, который является диспетчером пакетов Node.js:

$ npm -v

Он должен вернуть версию установленного npm, например 6.14.11. Теперь вы готовы установить веб-сервер. Мы выбрали очень простой файл с автоматической перезагрузкой, т.е. при изменении (и сохранении) одного из файлов примера страница автоматически перезагрузится. Установите его с помощью:

$ npm i -g live-server

Эта команда установит команду live-server глобально. Учтите, что вам потребуются права root.

Выбор редактора кода

В принципе любого редактора кода должно быть достаточно для работы с нашим проектом. Так что если у вас уже есть любимый редактор, то вы можете использовать его. Если у вы не определились с редактором кода, то мы рекомендуем вам использовать Visual Studio Code или Atom. Оба редактора имеют фантастическую поддержку рабочих процессов JS.

Получение исходного кода

После установки Node.js и выбранного вами редактора вам понадобится исходный код Nano Dungeon. Исходный код этой книги доступен на GitHub.

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

Запуск примеров

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

Выполните команду:

$ live-server

Сервер запустится и откроет веб-страницу с запущенным примером.

Как работают игры

Прежде чем мы углубимся в изучение Phaser и кодирование, хорошо бы разобраться с некоторыми общими концепциями разработки игр. Самый важный из них — это игровой цикл. Рабочий процесс большинства игр привязан к игровому циклу, и понимание того, как он работает, помогает планировать и разрабатывать все виды игр.

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

В каждом такте игрового цикла должны выполняться одни и те же задачи. В такте нужно выяснить, что игрок пытается сделать, затем смоделировать последствия этих действий и, наконец, нарисовать это на экране. По сути, игровой цикл можно разделить на три этапа: получение данных от игрока, моделирование мира и отображение результата (рисунок. 2-1). Рисунок 2-1. Игровой цикл.

Например, в игре Pac-Man в игровом цикле (упрощенно) собирается пользовательский ввод с джойстика и решается в каком направлении игрок пытается двигаться, а затем вычисляется новая позиция для игрока. После этого расчитывается куда каждый из призраков пытается переместиться, и принимается решение об их новом положении. Наконец, игрок и призраки отображаются в новых местах. Это повторяется каждый кадр, создавая иллюзию непрерывного движения.

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

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

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

Пришло время узнать, как эта концепция применима к играм на основе Phaser.