GameMaker Studio 2. Урок 1. Знакомство

Вступление

Привет-привет, мои хорошие! На связи Grimm Ironwill, в реальности – Вячеслав Брянцев.

Вкратце о себе. Студент третьего курса; программист. Занимался уже много чем, в том числе и преподаванием.

Это – первый пост из, я надеюсь, серии о том, как разрабатывать игры на Gamemaker Studio 2. На данном движке я работаю с декабря 21-го года и уже заимел опыт, который позволяет мне делать на нём полноценные игры, чем мы и будем здесь заниматься.

Так как пост первый, он же является вступительным. Здесь будет основная информация о движке; где его достать; что в нём есть и как в нём работать; как сделать передвижение персонажа; какую игру мы будем делать по данным гайдам.

Гайд нацелен на ту часть людей, что хотя бы немного понимает о том, что такое программирование, но не имеет опыта работы с игровыми движками, в создании игр. Первый гайд будет достаточно подробно объяснять, что есть что. В дальнейшем подобных описаний станет меньше.

О движке

С относительно недавних пор Gamemaker Studio 2 распространяется по подписочной системе, при этом сам движок – бесплатный. Подписки делятся на уровни и, в зависимости от уровня, дают Вам разные приколюхи, вроде бесплатных ассетов раз в месяц. Самое важное, что даёт подписка – возможность экспортировать свою игру на ту или иную платформу. Однако, разрабатывать игры под разные платформы вы можете сразу на бесплатной версии.

В рамках данных гайдов Вы будете работать на бесплатной версии движка (хотя можете приобрести любую). Я же имею лицензию GMS2 Desktop в стиме, поэтому работать буду на ней. Разницы в функционале между данными версиями нет.

Скачать бесплатную версию с официального сайта:

https://gamemaker.io/ru/get

После установки

Первое, что стоит сделать после установки движка – это в нём разобраться.

После запуска Вас будет ждать следующее меню:

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Я замазал свои недавние проекты, оно у вас будет голое 😊

Так вот. Разберёмся со стартовым меню и почему не стоит переводить Гейммейкер, хоть такая возможность и присутствует.

Три самые важные кнопки – New, Open и Import позволяют создать новый проект или открыть существующий. Разница между Open и Import исключительно в формате файлов, которые они открывают.

Tutorial – понятное дело, ведёт на сайт с туториалами. Для закрепления материалов и изучения возможностей движка, помимо данной данных гайдов, настоятельно рекомендую ознакомиться.

В верхней панели также есть несколько важных разделов.

File – меню управления нашим окном. Здесь же, открыв Preferences или нажав CTRL+SHIFT+P, можно настроить нашу среду разработки, в том числе сменить её язык. Но делать этого не стоит, о чём ниже. Тут же можно поменять цветовую схему, шрифты и многое другое.

Перевод Gamemaker Studio 2 оставляет желать лучшего, хотя переведена не только среда, но и её мануал. Я надеюсь, что я ошибаюсь, но очень часто перевод выглядит так, словно его просто запихнули в гугл транслейт. В мануале к тому же переводят названия встроенных функций, что просто нонсенс. Поэтому только английский – только хардкор. В любом случае, непонятные фрагменты текста можно перевести самостоятельно, будет понятнее.

Build – запуск нашей игры или её дебаг. Очисткой не пользовался, не скажу. Разница между простым запуском и дебагом в количестве вылезающих окошек. Дебаг не только подсветит ошибку, если в ходе игры она произойдёт, но также выведет информацию о производительности. Сокращения: F5 для запуска и F6 для дебага.

Marketplace – местный «рынок», в котором очень много ВСЕГО. Готовые спрайты, звуки, полноценные ассеты, различные специалисты и даже функции. Мой совет: не покупайте здесь готовый код (функции). Огромный минус местного рынка – свои «работы» могут выкладывать простые пользователи и ставить им ценник, при этом их никто не проверяет (как мне кажется). Поэтому за пару баксов вам могут подкинуть кусок кода из пяти строк, в котором своего нет ничего – используются только встроенные в ГМ функции в определённом порядке. Знаю о чём говорю, так как сталкивался с таким. С другой стороны, спрайты, музыку и прочие ассеты можете брать на своё усмотрение.

Знакомство с движком

Цель данных гайдов – обучиться взаимодействию с движком, постепенно создавая свою игру. Это будет стратегия, похожая на «Oxygen not included» и «Fallout shelter», но со своими приколами. На мой взгляд, жанр стратегий подойдёт лучше для ознакомления с функционалом движка. 😊

Нажимаем кнопку «New», выбираем «New Blank», после чего в «Project Name» называем нашу игру (на Ваше усмотрение). Если у Вас вдруг выдало выбор между GML и DnD, выбираем GML – язык нашего движка. DnD – режим создания игр с помощью визуальных блоков.

Итак, у нас открыто окно проекта. Что у нас есть?

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Справа – наш браузер ассетов, обозреватель и так далее, кому как удобнее. Суть в том, что здесь по папкам мы будем раскидывать функции, спрайты и прочие игровые объекты. Имейте ввиду, что папки в данном окне хоть и сделаны заранее, но могут быть спокойно переименованы, удалены или перемещены. Вы можете спокойно писать названия папок на русском языке – ошибок это не вызовет. Главное: все исполняемые объекты называйте на английском.

Откроем папку «Rooms», после чего два раза кликнем по «Room1». Это – наша первая игровая комната.

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Не пугайтесь внешнего вида нашего движка. Пройдём последовательно по тому, что у нас есть.

Окошко «Layers – Room1»

Как понятно из названия, здесь расположены «слои» нашей комнаты. На разных слоях мы можем располагать разные объекты. В их число входят: слой заднего фона, слой инстансов, слой тайлов, слой путей, слой ассетов. Также имеются фильтры и папки для слоёв.

Инстанс и объект.

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

Размещать инстансы можно только на слое инстансов.


Слой тайлов.

Позволяет размещать на себе «тайлы» - клетки. В гейммейкере есть встроенный инструмент под названием «Tile set» - это набор клеток (спрайтов), которые могут быть использованы в игре. С его помощью можно будет из готовых клеток «рисовать» свои собственные карты. В том числе, для этого есть инструмент «Auto Tile», который размещает нужные клетки в автоматическом порядке. Мы всё это рассмотрим в будущих гайдах.

Слой путей.

В игровой движок встроены функции, которые позволяют создавать пути между двумя точками. Используется алгоритм А* (А стар, а звёздочка) для квадратных сеток двух типов: с диагональным движением и без.

Минус встроенного алгоритма – он не учитывает стоимость движения и работает немножко топорно, но для простой игры он сойдёт.

Слой путей делать при этом необязательно. Слой путей позволяет расставлять пути самостоятельно.

Окошко «Properties – Room1»

Как ни странно, это настройки нашей текущей комнаты.

Чекбокс «Persistent» отвечает за то, является наша комната постоянной или нет. Иными словами, будет ли продолжать выполняться код в данной комнате, если мы из неё куда-то свалим или нет.

Чекбокс «Clear Display Buffer» советую держать включённым, так как по идее повышает производительность.

«Width» и «Height» - ширина и высота нашей комнаты. Размер комнаты != размер экрана и может сильно от него отличаться.

Ниже имеются вкладки Viewports and Cameras, а также Room Physics. Первая нужна для создания камеры и её настройки, вторая – для физики комнаты. Вторая вкладка нам не нужна, а с первой мы с вами ещё поработаем.

Скажу сразу. В гейммейкере некоторые моменты нужно писать самостоятельно. Самое простое, что приходит на ум: чтобы не перегружать компьютер, те объекты, которые «мы не видим», мы должны отключать (или не рисовать) самостоятельно.

Начало начал

Начнём с того, что создадим нашего игрока. Для этого выделите папку «Objects» и нажмите «ALT + O» или нажмите правой кнопкой мыши, выберите «Create», «Object».

В поле «Name» переименуем нашего игрока в «oPlayer».

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Разберём, что у нас здесь есть.

1. Название нашего объекта.

2. Спрайт объекта (картинка, которая будет обозначать наш объект, двигаться, etc.)

3. Ряд настроек объекта:

a. Visible – видим наш объект или нет.

b. Persistent – по аналогии с комнатой, будет ли код данного объекта исполняться, пока мы переключены на другую комнату, или нет.

c. Solid – «твёрдость» объекта. Может ли он проходить сквозь другие объекты, которые имеют те же свойства. Нам не нужно.

d. Uses Physics – используется ли встроенная в движок физика. Тоже нам не нужно.

4. Ещё одно поле настроек.

a. Events – события, во время которых происходят какие-либо действия. Открыты по умолчанию (см поле под цифрой 5)

b. Parent – Есть ли у нашего объекта «родители» и «дети». Используется для того, чтобы объединить объекты в группы, с которыми можно взаимодействовать.

i. Пример: объединим объекты: «мечник», «лучник», «маг» в группу, назначив каждому из них в качестве родителя объект «юнит». Так мы можем обращаться не к каждому объекту по отдельности, а к объекту-родителю, чтобы, например, проверить, есть ли какой-либо из них в нашей комнате.

c. Physics – настройка встроенной в движок физики.

d. Variable Definitions – здесь мы можем объявить переменные и настроить их, но также это можно делать непосредственно в коде.

5. Окно событий. Сюда будут добавляться все события, которые мы выберем.

6. Кнопка для добавления событий.

Сначала нажмём на квадрат с плюсиком, под цифрой 2 на скриншоте. У нас открылось меню для рисования спрайта и он сразу же выбрался как спрайт объекта «oPlayer».

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Изменим имя спрайта с «Sprite1» на «sPlayer». Справа сверху в выпадающем меню выберем «Middle Centre», чтобы выбрать в качестве центровой точки центр нашего спрайта. Относительно этой точки и будут происходит все вычисления. Затем нажмём «Edit image».

Лирическое отступление для внимательных. Мы назвали объект «oPlayer», а спрайт «sPlayer» для удобства. Первая буква перед основным названием нужна исключительно для того, чтобы определять, о чём у нас идёт речь, так как в своём коде мы можем взаимодействовать со всеми объектами, что у нас есть в обозревателе. Перейдём к «Edit image».

Здесь Вы можете самостоятельно разобраться в том, что за что отвечает. Наша с вами цель – нарисовать любой объект (можно хоть всё одним цветом залить).

Когда закончите, сверху выберите вкладку «Room1». Справа выберите «oPlayer», нажав по нему один раз ЛКМ, затем, с зажатым ALT, кликните по любому месту в комнате. Поздравляю, вы разместили игрока! Осталось его настроить. Для этого нажмите два раза по «oPlayer».

Нажмите «Add Event» и выберите «Create». Откроется окно для написания кода. В данном случае, написанный код будет исполняться при создании объекта в комнате.

Давайте назначим нашему игроку базовую характеристику: скорость:

player_speed = 5;

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Точку с запятой писать необязательно, но у меня это привычка. 😊

В событии создания (Create) обычно прописывают константы – те переменные, которые не будут меняться в ходе работы программы. Впрочем, никто не запрещает для удобства перечислить здесь все переменные.

Итак, наша задача сейчас – заставить нашего игрока двигаться. Для этого, добавим новое событие:

«Add Event» -> «Step» -> «Step»

Таким образом мы создали событие, которое повторяется каждый «шаг», иными словами – кадр.

Немного теории.

Для изменения координат объекта в гейммейкере существуют «встроенные» переменные «x» и «y». Просто добавлять к ним скорость некорректно, так как пользователь может двигаться по диагонали и в случае простого добавления скорости, движение по диагонали выйдет слишком быстрым. Чтобы это исправить, мы будем:

- Считывать, какие клавиши нажаты.

- Использовать встроенные функции для расчёта передвижения.

Практика:

Чтобы сохранить клавишу, которую нажал игрок, удобнее всего будет запихнуть её в переменную.

В Step’е пишем:

key_up = keyboard_check(ord("W")) or keyboard_check(vk_up);

Что происходит: если пользователь нажмёт кнопку «W» или стрелочку вверх – переменная key_up станет равна 1, если же кнопки не нажаты – будет равна 0. «ord» нужно, чтобы указать клавишу на клавиатуре, однако для стрелочек существуют команды vk_up, vk_left, vk_right, vk_down. Такие же обозначения есть для других клавиш, вроде пробела, шифта и т.д. По аналогии, напишем код для других кнопок.

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Теперь нам нужно понять, куда двигается наш игрок и двигается ли вообще.

Для того, чтобы узнать направление, нам нужно воспользоваться встроенной функцией point_direction(). Чтобы подробно узнать о том, как она работает, напишите данную функцию, наведитесь на неё и нажмите на колёсико мыши. У вас автоматически откроется справка с подробным описанием.

Открыть подобным образом можно любую встроенную функцию. Мануал также доступен на русском языке.

Функция point_direction возвращает вектор, образованный указанными парами координат. Соответственно, в скобках указываются: x1, y1, x2, y2. Так как мы знаем, что если кнопка не нажата, то она равна нулю, а если нажата – единице, то вычитая противоположные по направлению переменные, можем получить нужное нам направление движения.

movement_dir = point_direction(0, 0, key_right - key_left, key_down - key_up);

С-но, чтобы отследить нажатие кнопок, нам нужно создать вторую переменную. Работает она по такой логике: если была нажата одна из кнопок – переменная будет равна единице (true – истина в языке GML).

movement_input = (key_right - key_left != 0) or (key_down - key_up != 0);

У опытных или внимательных может возникнуть вопрос, зачем нам это, если мы можем отслеживать «movement_dir != 0»? Дело в том, что подобный вариант заставит наш объект «запинаться» во время резких поворотов, что нас не устраивает.

Теперь настало время знакомиться с логическими операторами. В GML’е их три и они имеют следующий синтаксис:

if событие {}

else if событие {}

else {}

Нам нужно отловить момент, когда нажата кнопка. Для этого напишем:

if (movement_input)

{

}

ОК, мы помним, что не можем просто приплюсовать координаты. Но, для расчёта правильного движения, у нас есть: вектор движения, скорость и встроенная функция, которая рассчитает количество пикселей, которое нам нужно пройти по данному вектору, чтобы оказаться в такой-то точке. Так что создадим две новые переменные, куда передадим эти данные, а затем приплюсуем их к координатам. Внутри фигурных скобок напишем:

var h_speed = lengthdir_x(player_speed, movement_dir);

var v_speed = lengthdir_y(player_speed, movement_dir);

x += h_speed;

y += v_speed;

GameMaker Studio 2. Урок 1. Знакомство Разработка, Gamedev, Программирование, Инди, Инди игра, Gamemaker Studio 2, Образование, Длиннопост

Код целиком.

Для чего мы писали «var» перед объявлением переменной? Таким образом мы обозначили, что данные переменные являются локальными. Их нельзя будет использовать из других частей программы. Более того, их также нельзя будет использовать в других событиях этого же объекта. На самом деле, это необязательно, но бытует мнение, что ускоряет работу кода. Если вы точно знаете, что какая-то переменная больше нигде использоваться не будет и менять её нежелательно – смело делайте её локальной.

Итак, сохраним проект (CTRL + S) и нажмём F5, чтобы проверить.

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

В следующем гайде мы подробно разберём события отрисовки, как они работают. Напишем скрипт для вывода текста с обводкой, c нужным нам шрифтом и размером.

Примерный план:

- Общий обзор движка, передвижение. (Текущий гайд)

- Конкретизация разработки. События отрисовки. Коллизия. Как работают скрипты. Как подключить русский шрифт. Переходы между комнатами.

- Камера и её настройка. Разные способы реализации: от простого к сложному.

- Иерархия объектов. «Объекты-родители» и их «дети». Решение часто встречающихся проблем и немного про то, как удобно выстраивать взаимодействие с объектами. Глобальные переменные.

- Массивы и с чем их едят, а также grid (сетка комнаты), размещение объектов по сетке. Включая объяснение, в каких случаях лучше использовать встроенные функции, в каких – писать свои с нуля.

- Пути. Один большой гайд, включая скрипты поиска путей для различных сеток в т.ч. с примерами из моего личного проекта.

- Иные способы хранения информации в GMS2, когда их стоит или не стоит использовать.

- Сохранение. Встроенное VS самописное.

- Звуки.

П.С. Чукча не писатель и ориентируется на свои собственные ощущения от того, чего ему не хватало, когда он сам только изучал это всё дело, перебирая десятки форумов, сайтов и англоязычных видео.
Есть вопрос? Задавай! Постараюсь ответить.

Лига Разработчиков Видеоигр

6.7K постов22.2K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"