Разработка игр с помощью 3Dev

Разработка игр с помощью 3Dev

Дмитрий Салов

3Dev - свободный, кросплатформенный и простой игровой движок, разрабатываемый мной.

Где его скачать?

На официальной странице движка на GitHub, в разделе Releases, вы можете найти самую свежую и стабильную версию 3Dev. Помимо исходного кода, там вы можете скачать собранные .exe файлы (редактор, "лаунчер" и "render"). Когда скачаете последнюю версию, распакуйте архив. В результате у вас будет папка с каталогами "3Dev-Editor", "Launcher", "Render", "dll" и "shaders". В первых двух будет папка bin, где лежат .exe файлы. Перед тем как их запустить, обязательно перенесите все файлы из папки "dll" в каталог "System32". Первым делом, ознакомимся с редактором.

Интерфейс редактора

После запуска "editor.exe" появится окно с главным меню редактора.

При нажатии на New project откроется небольшое окно, где нужно ввести имя проекта и путь к папке, где он будет хранится. Например, если вписать "newProject" и "C:/Users/User/projects", в папке "projects" будет создан каталог "newProject".

При нажатии на Load project откроется окно со списком недавних проектов и полем для ввода пути к файлу проекта, кнопка справа от него откроет проводник.

Когда вы создадите или откроете проект, перед вами появится интерфейс редактора.

Посередине находится 3D вьюпорт, где рисуется ваша сцена. Снизу - окно с логами. Слева - кнопки для добавления скриптов и разных объектов: графических, физических и звуковых. Справа сверху - дерево сцены. Справа снизу - редактор свойств объектов или меню сохранение сцены, если в дереве ничего не выбрано.

Управление камерой

Для того чтобы управлять камерой, удерживайте правую кнопку мыши. Для того чтобы ее перемещать, используйте WASD, если при этом удерживать Shift, камера будет перемещаться в 2 раза быстрее, если удерживать Ctrl - в 2 раза медленнее.

Модели

На левой панели есть кнопки для создания как пустого объекта модели, так и куба. Созданная модель сразу будет выбрана в дереве, а на панели свойств появится множество пунктов: имя модели, положение в пространстве, поворот, а также размер. Ниже - слоты для материалов, тип физического тела, галочка, отвечающая за включение/отключение отрисовки объекта и две кнопки: открыть файл и удалить.

При нажатии на Open file, откроется окно проводника, позволяющее выбрать файл модели.

После загрузки модели, содержащей более одного меша/материала, слотов под материалы станет больше. Модели можно копировать и вставлять с помощью Ctrl+C и Ctrl+V.

Материалы

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

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

Физика

В разделе "физика" на левой панели можно выбрать форму коллайдера для выбранной модели (при создании куба, а не пустой модели, у нее уже будет нужный коллайдер).

Источники света

Кнопка Light на левой панели отвечает за создание источников света. На панели свойств можно изменить положение, направление, цвет, затухание, cutoff, наличие теней от источника.

Источники звука

При нажатии кнопки Sound source откроется проводник, где можно выбрать файл со звуком (только .ogg или .wav). На панели свойств можно изменить имя звука, его положение, громкость, затухание, минимальное расстояние, на котором звук не будет приглушен, галочка, отвечающая за зацикливание звука, кнопки управления вопроизведением и кнопка удаления звука.

Сохранение сцены

Меню сохранения сцены показывается на панели свойств, если в дереве не выбран объект.

Вы можете ввести путь и имя сцены вручную, либо выбрать имя и путь файла в проводнике, нажав на троеточие. Когда имя и путь выбраны, можно нажать Save, либо Ctrl+S, чтобы сохранить сцену.

Скрипты

3Dev поддерживает написание скриптов на Angelscript. При нажатии кнопки Script, откроется проводник, позволяющий выбрать файл ".as". На панели свойств можно собрать все скрипты, запустить их, изменить значения переменных (только после успешной сборки) и удалить скрипт.

Объектный режим

Этот режим позволяет изменять позицию, вращение и размер объектов, не используя панель свойств. Попасть в него и выйти можно комбинацией Ctrl+G. В левом нижнем углу вьюпорта появится надпись.

По дефолту мы находимся в режиме перемещения по оси X. Ось можно менять клавишами X, Y и Z. Чтобы перейти в определенный режим, нужно использовать одну из следующих комбинаций: Alt+M - режим перемещения, Alt+R - режим вращения, Alt+S - режим масштабирования. Значение свойства по выбранной оси изменяется стрелками: вверх или направо - увеличение, вниз или налево - уменьшение.

Angelscript

Angelscript - шикарный скриптовый язык, напоминающий по синтаксису C++. Все основные аспекты Angelscript хорошо описаны в официальной документации.

Начать писать код можно в любом редакторе. Для vscode, atom, sublime и т.д. есть расширения, добавляющие подсветку синтаксиса. А вот, например, в codeblocks она есть по умолчанию.

Любой файл с кодом Angelscript имеет расширение ".as". Создадим, к примеру, "script.as" по пути "project/assets/scripts" и начнем писать.

Для того, чтобы скрипт запускался в 3Dev, нужно 2 функции: void Start(), которая выполняется единожды, и void Loop(), которая выполняется каждый кадр.

Начнем с простой сцены: пол и игрок.

Обратите внимание на панель свойств - body type у пола должен быть static, чтобы на него не действовали никакие физические силы.

Модели и все остальные объекты в скриптах мы можем получить из объекта сцены в виде указателей. В отличии от C++, указатели в Angelscript создаются следующим образом: Type@ name;

Еще одно отличие заключается в том, что по умолчанию все операторы взаимодействуют не с указателем, а с самим объектом:

Type@ object;

Type@ anotherObject;

...

object = anotherObject; // Используется оператор =, перегруженный в классе Type

@object = @anotherObject; // Указателю на object присваивается указатель на anotherObject

object.DoSomething(); // Разыменовывать указатель не нужно

Теперь, зная особенности указателей, можно продолжить писать скрипт.

Объект scene находится в пространстве имен Game. Помимо объекта сцены, там находятся некоторые другие объекты и переменные, о которых поговорим чуть позже.

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

Теперь, имея указатель на модель, можно делать с ней много всего интересного: перемещать, вращать, получать о ней какую-то информацию и т.д.

Например, попробуем при нажатии определенной клавиши переместить модель по оси X. Для работы с клавиатурой есть пространство имен Keyboard, где определены все клавиши и функция isKeyPressed, позволяющая узнать, нажата ли какая-то клавиша. Для перемещения модели будем использовать функцию Move.

Теперь можно вернуться к редактору, загрузить этот скрипт, собрать его кнопкой Build и запустить кнопкой Start / stop. При нажатии на Q "игрок" будет двигаться по оси X. Если снова нажать Start / stop, все вернется на свои места.

Время снова усложнять наш скрипт. К примеру, можно сделать полноценный FPS контроллер. Для этого не понадобится писать множество условий для клавиш WASD, можно использовать камеру, находящуюся в пространстве имен Game, и встроенную в нее функцию Move, которая даст вектор перемещения камеры.

Вместо единицы в аргументе лучше использовать delta time, но пока что можно и так :)

По умолчанию, функция Move вызывается редактором/лаунчером каждый кадр, поэтому в Game есть переменная manageCameraMovement. Для того чтобы камерой управлял только скрипт, установим ей значение false в функции Start().

Теперь, зная вектор перемещения, можно либо просто использовать Model::Move, либо поступить умнее, используя физику.

В классе Model есть метод для получения указателя на ее физическое тело - GetRigidBody. В свою очередь класс RigidBody имеет огромное количество функций.

Управление можно сделать двумя способами: напрямую изменять скорость физического тела или применять к нему определенную силу. Оба варианта в самом простом исполнении не идеальны, в первом случае это не очень хорошо сказывается на реакции объекта на коллизию, во втором управление получается слишком неотзывчивым. Но вот моя лучшая версия FPS Controller'а!

Сейчас разберем 1-й способ. Используя функции setLinearVelocity и getLinearVelocity, установим правильную скорость объекту, основываясь на направлении.

Запускаем и получаем вполне себе неплохую систему передвижения. Единственное, можно не отрисовывать модель игрока. Это делается в редакторе.

Хотите сделать нечто большее? Изучайте ScriptManager.cpp вот отсюда, попутно смотря на классы в папке include. Да, в статье будет появляться новая информация, но ведь что-то изучать и пробовать самостоятельно так интересно! :)

С версии редактора 1.3.0 в нем появился встроенный редактор кода. Теперь при добавлении скрипта через кнопку на левой панели можно не только выбрать файл с кодом, но и создать новый. В любом случае, после выбора или создания файла откроется сам редактор кода. В нем нет ничего особенного. Сохранить файл можно комбинацией Ctrl+S, а выйти - с помощью клавиши Esc. Также при выборе скрипта в дереве сцены появилась кнопка Edit script, которая откроет выбранный скрипт в редакторе кода.


Report Page