Основы разработки игр на движке GameMaker

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

1. Знакомство с GameMaker: Установка, интерфейс и создание первого проекта

Знакомство с GameMaker: Установка, интерфейс и создание первого проекта

Добро пожаловать в курс «Основы разработки игр на движке GameMaker». Если вы читаете эту статью, значит, вы решили сделать первый шаг к созданию собственных игровых миров. GameMaker — это не просто программа, это инструмент, который подарил миру такие шедевры, как Undertale, Hyper Light Drifter, Katana ZERO и Hotline Miami.

В этой вводной статье мы пройдем путь от «чистого листа» до запуска вашего первого проекта. Мы разберем, как установить движок, как не потеряться в его интерфейсе и, самое главное, поймем фундаментальную логику работы GameMaker.

Почему GameMaker?

Прежде чем мы начнем установку, важно понять, с чем мы имеем дело. GameMaker (ранее GameMaker Studio 2) специализируется на создании 2D-игр. В отличие от тяжеловесных движков вроде Unreal Engine или Unity, которые пытаются уметь «всё и сразу», GameMaker заточен под двухмерную графику. Это делает его идеальным выбором для инди-разработчиков и новичков.

Ключевые особенности:

  • Низкий порог входа: Вы можете начать создавать игры, используя визуальное программирование (GML Visual), вообще не написав ни строчки кода.
  • Мощный язык GML: GameMaker Language (GML) — это скриптовый язык, похожий на C++ и JavaScript, который дает вам полный контроль над игрой, когда вы будете к этому готовы.
  • Кроссплатформенность: Вы можете экспортировать свою игру на Windows, Mac, Linux, Android, iOS и даже консоли.
  • Шаг 1: Установка GameMaker

    Процесс установки максимально упрощен, но требует создания учетной записи.

  • Регистрация: Перейдите на официальный сайт GameMaker. Вам потребуется создать аккаунт Opera (так как GameMaker теперь принадлежит компании Opera) или войти через существующий.
  • Выбор лицензии: Для обучения и создания игр для себя вам будет достаточно бесплатной версии. Она позволяет экспортировать игры на десктопные платформы (Windows, Mac, Linux) без водяных знаков (для коммерческого использования на консолях потребуются платные тарифы).
  • Скачивание: В личном кабинете найдите раздел «Download» и выберите версию для вашей операционной системы.
  • Установка: Запустите скачанный инсталлятор и следуйте стандартным инструкциям. При первом запуске программа попросит вас войти в свой аккаунт Opera для подтверждения лицензии.
  • Шаг 2: Стартовый экран и создание проекта

    После запуска вы увидите стартовое окно (Start Page). Здесь находятся последние новости, обучающие материалы и список ваших недавних проектов.

    Чтобы начать, нажмите кнопку New (Новый). Вам предложат выбрать тип проекта:

  • Game: Стандартный пустой проект.
  • Template: Проект на основе шаблона (например, готовый платформер).
  • Для нашего обучения мы всегда будем выбирать Game -> Blank Game (Пустая игра), чтобы разобраться во всем самостоятельно. Вам также предложат выбрать язык программирования: GML Code (код) или GML Visual (блоки). В рамках этого курса мы будем ориентироваться на GML Code, так как это профессиональный стандарт, но логика работы везде одинакова.

    Шаг 3: Интерфейс GameMaker (IDE)

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

    !Схема основного интерфейса GameMaker с выделенными ключевыми зонами.

    1. Asset Browser (Браузер ресурсов)

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

    2. Workspace (Рабочее пространство)

    Это центральная и самая большая часть экрана. Здесь вы будете проводить 90% времени. В Workspace открываются окна редакторов: здесь вы рисуете спрайты, пишете код и настраиваете объекты. Пространство бесконечное — вы можете двигать его, зажав колесико мыши.

    3. Room Editor (Редактор комнат)

    Это визуальный редактор уровней. Здесь вы расставляете объекты, создаете декорации и настраиваете камеру.

    Фундаментальная концепция: Спрайт, Объект, Комната

    Это самая важная часть статьи. Если вы поймете разницу между этими тремя понятиями, вы поймете GameMaker.

    Многие новички путают картинку и игровой персонаж. В GameMaker это разные сущности.

    Спрайт (Sprite)

    Это просто картинка. Она не умеет двигаться, не умеет думать, у нее нет физики. Это просто набор пикселей (PNG, JPEG и т.д.). Спрайт — это «костюм» для вашего персонажа.

    Объект (Object)

    Это мозг и тело. Объект содержит программный код. Он знает, как двигаться при нажатии клавиш, что делать при столкновении со стеной и сколько у него здоровья. Сам по себе объект невидим, пока вы не «наденете» на него Спрайт.

    > Важное правило: Мы программируем Объекты, но видим Спрайты.

    Комната (Room)

    Это сцена или уровень. Игра не может существовать в пустоте. Все объекты должны быть помещены в Комнату, чтобы начать работать. Игра всегда начинается с первой комнаты в списке Asset Browser.

    [VISUALIZATION: Диаграмма связей. Слева иконка картинки с подписью

    2. Архитектура игры: Работа со спрайтами, объектами, событиями и комнатами

    Архитектура игры: Работа со спрайтами, объектами, событиями и комнатами

    В предыдущей статье мы установили GameMaker и познакомились с его интерфейсом. Теперь пришло время заглянуть «под капот» игрового движка. Чтобы создать игру, недостаточно просто нарисовать красивого персонажа. Нужно вдохнуть в него жизнь, научить его взаимодействовать с миром и поместить этот мир в рамки экрана.

    GameMaker использует уникальную архитектуру, основанную на четырех китах: Спрайты, Объекты, События и Комнаты. Понимание взаимосвязи этих элементов — это 80% успеха в обучении. Если вы поймете эту логику сейчас, написание кода в будущем станет для вас интуитивно понятным процессом.

    Спрайты (Sprites): Визуальная оболочка

    Спрайт — это любой графический ресурс в вашей игре. Это может быть персонаж, дерево, пуля, элемент интерфейса или фон. Но важно помнить: спрайт — это просто картинка. У него нет интеллекта, он не знает, что он «враг» или «герой».

    Точка привязки (Origin Point)

    Когда вы загружаете спрайт в редактор, вы увидите крестик, который можно перемещать. Это Origin Point (Точка привязки). Это одна из самых важных настроек, о которую спотыкаются новички.

    Координаты спрайта в игровом мире отсчитываются именно от этой точки. Если вы вращаете спрайт, он будет вращаться вокруг этой точки, как лист бумаги, приколотый кнопкой к стене.

    * Top Left (0, 0): По умолчанию точка стоит в левом верхнем углу. Это удобно для интерфейса или тайлов (блоков земли). * Middle Centre: Для персонажей и врагов точку обычно ставят ровно в центр. Это упрощает вычисления столкновений и поворотов.

    !Сравнение вращения объекта в зависимости от расположения точки привязки (Origin Point).

    Маска коллизии (Collision Mask)

    В редакторе спрайтов есть раздел Collision Mask. Это зона, которая физически «существует» для движка. Спрайт может быть огромным драконом, но если его маска коллизии — маленький квадратик в центре, то игрок сможет проходить сквозь крылья и хвост дракона, не получая урона. Обычно маску настраивают так, чтобы она покрывала основное тело объекта.

    Объекты (Objects): Мозг и логика

    Если спрайт — это костюм, то Объект — это актер, который его надевает. Объект содержит в себе всю логику поведения.

    Концепция «Чертеж и Экземпляр»

    В программировании это называется «Класс и Объект», но в GameMaker мы используем термины Object (Объект) и Instance (Экземпляр).

    Представьте, что Объект в браузере ресурсов — это чертеж дома. Вы не можете жить в чертеже. Но используя этот чертеж, вы можете построить 100 реальных домов на улице. Эти реальные дома называются Экземплярами.

    * Object (в Asset Browser): Это шаблон. Здесь мы пишем код: «Если нажат пробел, подпрыгнуть». * Instance (в Room Editor): Это конкретная копия объекта в уровне. Если вы измените переменную здоровья у одного экземпляра врага, остальные враги (экземпляры того же объекта) не пострадают.

    > Золотое правило: Мы программируем Объекты, но в игре взаимодействуют Экземпляры.

    События (Events): Сердцебиение игры

    GameMaker — это событийно-ориентированный движок. Код здесь не выполняется сплошным потоком сверху вниз. Код выполняется только тогда, когда происходит определенное Событие.

    Когда вы открываете объект, вы видите окно Events. Вот основные события, которые вы будете использовать в 99% случаев:

    1. Create Event (Событие создания)

    Срабатывает один раз в тот момент, когда экземпляр появляется в комнате. Это идеальное место для инициализации переменных.

    Пример логики: * Здоровье = 100 * Скорость = 5 * Имя = "Игрок 1"

    2. Step Event (Событие шага)

    Это самое важное событие. Оно срабатывает каждый кадр игры. Если ваша игра работает со скоростью 60 FPS (кадров в секунду), то код внутри Step Event выполнится 60 раз за одну секунду.

    Здесь происходит вся магия: проверка нажатия клавиш, перемещение, проверка столкновений. Если вы хотите, чтобы персонаж двигался, вы должны обновлять его координаты именно здесь.

    Рассмотрим простую математическую модель времени кадра:

    Где — время, которое длится один кадр (в секундах), а — количество кадров в секунду (Frames Per Second). При 60 FPS один кадр длится примерно 0.016 секунды.

    3. Draw Event (Событие отрисовки)

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

    4. Collision Event (Событие столкновения)

    Срабатывает, когда маска коллизии одного объекта пересекается с маской другого. Здесь мы пишем логику: «Если пуля столкнулась с врагом -> уничтожить пулю, отнять здоровье у врага».

    !Упрощенная схема игрового цикла GameMaker, показывающая порядок выполнения событий.

    Комнаты (Rooms): Сцена

    Все, что мы создали ранее, не имеет смысла без Комнаты. Room — это пространство, где живут экземпляры. Это ваши уровни, меню и экраны загрузки.

    Система координат

    В школе нас учили, что ось направлена вверх. В GameMaker (и в большинстве 2D-движков) это не так.

    * Ось X: Направлена вправо (как обычно). * Ось Y: Направлена вниз. * Точка (0, 0): Находится в левом верхнем углу комнаты.

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

    Формула перемещения по горизонтали выглядит так:

    Где — новая координата объекта, — текущая координата, а — скорость по оси X (положительная для движения вправо, отрицательная для движения влево).

    Слои (Layers)

    Редактор комнат работает по принципу слоеного пирога. Слева в редакторе вы увидите панель слоев:

  • Background Layer: Для заднего фона (картинка или цвет).
  • Instance Layer: Именно сюда мы перетаскиваем наши объекты. Объекты на этом слое будут взаимодействовать друг с другом.
  • Tile Layer: Для рисования карты уровня из кусочков (тайлов), что экономит ресурсы компьютера.
  • Asset Layer: Для простого размещения спрайтов, которым не нужна логика (например, трава или камни на фоне).
  • Практический пример архитектуры

    Давайте соберем все знания в единый алгоритм создания простейшей сущности в игре:

  • Создаем Спрайт: Рисуем или импортируем картинку героя. Настраиваем Origin Point по центру и Collision Mask.
  • Создаем Объект: Создаем новый объект и назначаем ему наш спрайт.
  • Добавляем События:
  • В Create* задаем переменную скорости. В Step* пишем код: «Если нажата стрелка вправо, увеличить X».
  • Размещаем в Комнате: Открываем Room1, выбираем слой Instances и перетаскиваем туда наш Объект.
  • Теперь, когда вы нажмете кнопку Run (Запустить), GameMaker скомпилирует проект, создаст окно, загрузит комнату, создаст экземпляр объекта, выполнит его событие Create и начнет бесконечно выполнять событие Step, пока вы не закроете игру.

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

    3. Основы программирования на GML: Переменные, условия и циклы

    Основы программирования на GML: Переменные, условия и циклы

    В предыдущих статьях мы научились создавать спрайты, объекты и комнаты. Мы собрали «тело» нашей игры, но пока оно неподвижно. Чтобы вдохнуть в него жизнь, нам нужен «мозг». В GameMaker роль мозга выполняет код, написанный на языке GML (GameMaker Language).

    Многих новичков пугает слово «программирование». Кажется, что это сложная математика и тысячи строк непонятных символов. На самом деле, программирование на GML — это просто написание инструкций. Представьте, что вы пишете рецепт блюда или инструкцию по сборке мебели. Только вместо повара или сборщика ваши команды выполняет компьютер.

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

    Переменные: Контейнеры для данных

    Представьте, что ваша игра — это огромный склад. Чтобы не потерять данные (здоровье игрока, количество патронов, скорость), нам нужно разложить их по коробкам и подписать каждую маркером. В программировании такие коробки называются переменными.

    Переменная — это именованная ячейка памяти, в которой хранится значение. Вы можете создать переменную, дать ей имя и положить в нее число или текст.

    Создание переменной (Присваивание)

    В GML создание переменной происходит через знак равенства =. Это не математическое равенство, а команда «положить значение справа в коробку слева».

    Области видимости (Scope)

    Это самая важная концепция в GML, которую нужно понять сразу. В зависимости от того, как вы объявите переменную, она будет доступна разным частям игры. В GameMaker существует три основных типа переменных:

    !Диаграмма областей видимости переменных: локальные, переменные экземпляра и глобальные.

    #### 1. Переменные экземпляра (Instance Variables)

    Это стандартный тип переменных. Если вы просто напишете hp = 100 в событии Create, эта переменная «прилипнет» к конкретному экземпляру объекта. Она будет существовать, пока жив этот объект.

    * Где используются: Здоровье, скорость, патроны, состояние конкретного врага. * Доступ: Доступна в любом событии этого объекта.

    #### 2. Локальные переменные (Local Variables)

    Они объявляются с ключевым словом var. Эти переменные существуют только один кадр и только внутри того куска кода (скрипта или события), где были созданы. Как только код заканчивает выполняться, переменная стирается из памяти.

    * Где используются: Для временных вычислений, счетчиков в циклах. * Зачем нужны: Чтобы не засорять память игры мусором.

    #### 3. Глобальные переменные (Global Variables)

    Они объявляются с префиксом global.. Эти переменные принадлежат не объекту, а всей игре. Они доступны из любой комнаты и любого объекта.

    * Где используются: Общий счет, настройки игры, сохранения.

    Типы данных

    Вам не нужно явно указывать тип данных (как в C++ или Java), GameMaker определяет его сам, но вы должны понимать разницу:

  • Real (Числа): Любые числа. Примеры: 10, -5, 3.14.
  • String (Строки): Текст. Всегда пишется в кавычках. Пример: "Game Over".
  • Boolean (Булевы значения): Истина или ложь. Примеры: true (истина), false (ложь). В GML true также равно 1, а false равно 0.
  • Математика в коде

    Программирование неразрывно связано с математикой, но в GameMaker она чаще всего простая. Рассмотрим формулу изменения позиции персонажа:

    Где — новая координата, — текущая координата, — скорость движения, а — направление (1 или -1).

    В коде GML это записывается проще. Например, чтобы сдвинуть игрока вправо:

    Или сокращенно:

    Условия: Принятие решений

    Код становится полезным только тогда, когда он может реагировать на ситуации. Для этого используется конструкция if (если).

    Синтаксис выглядит так:

    Операторы сравнения

    Чтобы задать условие, нам нужно что-то с чем-то сравнить. Обратите внимание на двойное равенство == при сравнении.

    * == : Равно ли? (Проверка) * != : Не равно * > : Больше * < : Меньше * >= : Больше или равно * <= : Меньше или равно

    > Частая ошибка: Новички путают = (присвоить значение) и == (сравнить значения). Запомните: hp = 10 делает здоровье равным 10. if (hp == 10) спрашивает, равно ли здоровье 10.

    Логические операторы

    Иногда нужно проверить сразу несколько условий. Например: «Если нажата кнопка ВПРАВО И перед нами нет стены».

    * && (или and): И. Оба условия должны быть верны. * || (или or): ИЛИ. Хотя бы одно условие должно быть верно. * ! (или not): НЕ. Инвертирует значение (превращает правду в ложь и наоборот).

    Пример сложного условия:

    Циклы: Автоматизация повторений

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

    1. Цикл repeat

    Самый простой цикл в GML. Он просто повторяет код указанное количество раз.

    2. Цикл while

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

    3. Цикл for

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

    Формальная запись цикла выглядит так:

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

    Пример в коде:

    Практический пример: Движение персонажа

    Давайте объединим переменные и условия, чтобы написать базовый код движения для события Step.

    В этом примере мы использовали: * Локальные переменные (var), чтобы считать ввод игрока. * Арифметику, чтобы вычислить вектор движения. * Условие (if), чтобы проверить, нужно ли вообще двигаться.

    Заключение

    Сегодня вы освоили алфавит языка GML. Переменные позволяют игре «помнить», условия — «думать», а циклы — «работать эффективно». Это база, на которой строится любая механика: от стрельбы в платформере до экономики в стратегии.

    В следующей статье мы применим эти знания для решения одной из самых сложных задач в разработке игр — системы столкновений (коллизий). Мы научим персонажа не проходить сквозь стены и правильно реагировать на препятствия.

    4. Реализация игровых механик: Движение, физика и система столкновений

    Реализация игровых механик: Движение, физика и система столкновений

    В предыдущих статьях мы создали «тело» игры (спрайты и объекты) и изучили «язык» общения с движком (переменные, условия, циклы). Теперь пришло время объединить эти знания, чтобы решить одну из самых важных и сложных задач в разработке игр — заставить персонажа двигаться естественно и взаимодействовать с твердыми предметами.

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

    Векторное движение вместо телепортации

    Новички часто пишут код так:

    Это работает, но это «телепортация» на 4 пикселя каждый кадр. Для создания плавной физики нам нужно разделить понятие позиции и скорости.

    Мы введем две ключевые переменные, которые станут основой физики любого 2D-объекта:

    * hsp (Horizontal Speed) — горизонтальная скорость. * vsp (Vertical Speed) — вертикальная скорость. * grv (Gravity) — сила гравитации.

    В событии Create нашего игрока мы инициализируем их:

    Теперь логика меняется. Мы не двигаем персонажа сразу. Сначала мы вычисляем, насколько он должен сдвинуться, и записываем это в hsp и vsp. И только в самом конце кадра мы применяем эти значения к координатам x и y.

    Формула обновления позиции выглядит так:

    Где — новая позиция, — текущая позиция, а — вектор скорости.

    Проблема столкновений (Коллизии)

    Самая большая проблема в играх — это застревание в стенах. Если персонаж стоит вплотную к стене, и мы прибавим к его координате 4 пикселя, он окажется внутри стены. Движок зафиксирует столкновение, и персонаж не сможет двигаться.

    Чтобы избежать этого, мы используем предиктивную систему столкновений (Predictive Collision System).

    Логика предсказания

    Вместо того чтобы двигаться и проверять «не ударился ли я?», мы спрашиваем: «Если я сдвинусь на hsp пикселей вправо, врежусь ли я в стену?».

    Для этого в GML есть идеальная функция:

    place_meeting(x, y, obj)

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

    !Визуализация работы функции place_meeting: проверка будущего места перед движением.

    Реализация горизонтального столкновения

    Давайте напишем алгоритм. Читайте внимательно, это «золотой стандарт» GameMaker:

  • Вычисляем желаемую скорость (hsp).
  • Проверяем: свободно ли место на расстоянии x + hsp?
  • Если свободно: просто прибавляем hsp к x.
  • Если занято (стена): мы не можем сделать полный шаг. Но мы не должны останавливаться за 4 пикселя до стены (это будет выглядеть как невидимый барьер). Мы должны подойти к стене вплотную, пиксель за пикселем, пока не коснемся её, и только тогда остановиться.
  • Для реализации шага 4 нам понадобится функция sign(n).

    Функция sign()

    Математическая функция знака (signum) возвращает: * 1, если число положительное. * -1, если число отрицательное. * 0, если число равно нулю.

    Пример:

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

    Код горизонтальной коллизии

    Вот как это выглядит в событии Step:

    Разберем цикл while: * Условие !place_meeting(x + sign(hsp), ...) означает: «Пока на 1 пиксель впереди свободно». * Действие x = x + sign(hsp) означает: «Сдвинься на 1 пиксель в сторону движения». * Как только следующий пиксель оказывается стеной, цикл прерывается, и мы останавливаемся ровно у края.

    Вертикальное движение и гравитация

    С вертикалью всё работает точно так же, только добавляется гравитация. Гравитация — это постоянное увеличение скорости падения.

    Формула изменения скорости при равноускоренном движении:

    Где — новая скорость, — текущая скорость, а — ускорение (в нашем случае гравитация grv).

    Код вертикальной физики

    Добавляем этот код в то же событие Step, ниже горизонтального блока:

    Обратите внимание на проверку place_meeting(x, y + 1, obj_wall). Она проверяет, есть ли стена ровно на 1 пиксель ниже нас. Если есть — значит, мы стоим на полу и можем прыгнуть.

    Полный код контроллера игрока

    Теперь соберем всё вместе. Это готовый скрипт для события Step объекта obj_player. Убедитесь, что у вас создан объект стены obj_wall.

    Почему это работает лучше стандартных инструментов?

    GameMaker предлагает встроенные переменные speed, gravity и события Collision. Почему мы их не используем?

  • Полный контроль: Используя свой код, вы точно знаете, почему персонаж двигается. Встроенная физика иногда ведет себя непредсказуемо.
  • Порядок действий: В нашем коде мы сначала проверяем, потом двигаем. В стандартных событиях Collision объект сначала врезается (застревает), а потом движок пытается его вытолкнуть. Это вызывает дрожание спрайтов и баги.
  • Настройка маски коллизии

    Помните, мы говорили о масках в статье про спрайты? Для этого кода критически важно, чтобы маска коллизии вашего игрока была прямоугольной (Rectangle), а не эллипсом или точной (Precise).

    Если маска будет менять форму при анимации (например, при беге персонаж наклоняется), он может застрять в стене просто потому, что спрайт стал шире на 1 пиксель. Часто разработчики создают отдельный спрайт spr_player_mask (просто прямоугольник), назначают его объекту игрока как Collision Mask, но рисуют красивый анимированный спрайт.

    Заключение

    Поздравляю! Вы только что написали полноценный физический движок для платформера. Ваш персонаж умеет бегать, прыгать, падать и корректно останавливаться перед препятствиями. Это фундамент, на котором строятся такие игры, как Celeste или Super Meat Boy.

    В следующей статье мы займемся визуальной и звуковой составляющей: научимся управлять анимациями через код и добавим звуковые эффекты, чтобы игра стала «сочной».

    5. Финальная полировка: Добавление звука, интерфейса и экспорт игры

    Финальная полировка: Добавление звука, интерфейса и экспорт игры

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

    Мы займемся тремя вещами, которые отличают «поделку» от «игры»: аудиодизайном, пользовательским интерфейсом (UI) и экспортом проекта в файл, который можно отправить друзьям.

    Часть 1: Работа со звуком (Audio)

    Звук — это 50% атмосферы игры. В GameMaker работа со звуком устроена просто, но есть нюансы оптимизации, о которых нужно знать с самого начала.

    Импорт звуков

    Звуки, как и спрайты, являются ресурсами. Чтобы добавить звук:

  • В Asset Browser нажмите правой кнопкой мыши -> Create -> Sound.
  • Дайте звуку имя с префиксом snd_ (например, snd_jump или snd_music).
  • В открывшемся окне нажмите кнопку ... рядом с полем Sound File и выберите файл (WAV, MP3, OGG).
  • Настройки сжатия (Важно!)

    В окне свойств звука есть выпадающий список Attributes / Audio Group. Это критически важная настройка для производительности.

    * Uncompressed - Not Streamed: Звук полностью распаковывается в оперативную память при запуске игры. Идеально для коротких звуков (выстрелы, прыжки, удары), которые должны воспроизводиться мгновенно. * Compressed - Streamed: Звук остается на диске и подгружается кусочками во время игры. Это обязательно для фоновой музыки. Если вы попытаетесь загрузить 3-минутный трек в оперативную память без сжатия, игра будет запускаться очень долго и потреблять много ресурсов.

    !Окно редактора звука, где красным выделена область выбора Attributes (Uncompressed vs Compressed) и кнопка выбора файла.

    Воспроизведение звука в коде

    Для проигрывания звука используется функция audio_play_sound(). У нее есть три обязательных аргумента:

  • soundid: Имя ресурса (например, snd_jump).
  • priority: Приоритет (число). Если каналов звука не хватит, движок заглушит звук с низким приоритетом. Обычно для музыки ставят 100, для важных эффектов 10, для фоновых шумов 1.
  • loop: Зацикливание (true или false). Музыку мы зацикливаем (true), звук прыжка — нет (false).
  • Пример внедрения: Вернемся к коду прыжка из прошлой статьи и добавим туда звук:

    Часть 2: Пользовательский интерфейс (GUI)

    Игроку нужно знать, сколько у него здоровья, какой счет и сколько патронов. Эта информация выводится в слое интерфейса (HUD).

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

    Для интерфейса существует специальное событие: Draw GUI.

    Событие Draw GUI

    Это событие рисует поверх всего игрового мира. У него своя система координат, которая привязана не к комнате, а к экрану (окну игры).

    * Координата в Draw GUI — это всегда левый верхний угол вашего монитора/окна, куда бы ни ушел игрок.

    !Слева изображение игрового мира с камерой, где координаты привязаны к карте. Справа изображение экрана монитора, где поверх игры наложен слой GUI с координатами (0,0) в углу экрана.

    Рисование текста и фигур

    Давайте создадим объект obj_game_manager (или obj_hud), который будет отвечать за интерфейс, и поместим его в комнату. В событии Draw GUI напишем:

    Математика полоски здоровья (Health Bar)

    Часто вместо цифр мы хотим нарисовать красивую полоску. Допустим, мы хотим нарисовать красный прямоугольник, длина которого зависит от текущего здоровья.

    Нам нужно вычислить текущую ширину полоски пропорционально здоровью. Для этого используем формулу пропорции:

    Где — текущая ширина полоски в пикселях (которую мы будем рисовать), — максимальная ширина полоски (например, 200 пикселей), — текущее здоровье игрока, а — максимальное здоровье.

    Пример в коде (Draw GUI):

    Часть 3: Управление состоянием игры

    Игра не может длиться вечно. Игрок может проиграть или выиграть. Нам нужно научиться перезапускать игру.

    Перезапуск комнаты

    Если здоровье игрока упало до нуля, мы обычно перезапускаем уровень. Для этого есть функция:

    Она возвращает все объекты в комнате в их исходное состояние (позиции Create Event).

    Важный нюанс: Глобальные переменные (global.score, global.hp) НЕ сбрасываются при перезапуске комнаты. Если вы хотите, чтобы при смерти здоровье снова стало 100, вы должны прописать это вручную перед перезапуском.

    Часть 4: Экспорт проекта

    Вы сделали игру. Теперь нужно передать её игрокам. GameMaker позволяет экспортировать игру на множество платформ, но в бесплатной версии вам доступны GX.games (браузерная платформа Opera) и Test Target (для локального тестирования).

    Если у вас есть лицензия (или пробный период), вы можете создать .exe файл для Windows.

    Процесс создания исполняемого файла

  • Target Manager: В правом верхнем углу IDE найдите иконку прицела. Выберите платформу (например, Windows).
  • Clean: Перед сборкой всегда полезно нажать иконку «метлы» (Clean) рядом с кнопкой запуска, чтобы удалить старые временные файлы.
  • Create Executable: Нажмите File -> Create Executable (или горячую клавишу F8).
  • Вам предложат два варианта: * Installer (NSIS): Создаст установочный файл (как setup.exe). Это выглядит профессионально, но требует установки. * Zip: Создаст архив с игрой. Игрок просто распакует его и запустит .exe. Для небольших инди-игр и джемов это предпочтительный вариант.

    Заключение курса

    Мы прошли путь от установки GameMaker до готового билда игры. Давайте вспомним, чему мы научились:

  • Архитектура: Мы поняли разницу между Спрайтом (картинкой) и Объектом (мозгом).
  • GML: Мы освоили переменные, условия и циклы.
  • Механика: Мы написали свою физику движения и столкновений, не полагаясь на стандартные инструменты.
  • Полировка: Мы добавили звук, интерфейс и научились собирать проект.
  • Это только начало. GameMaker — невероятно глубокий инструмент. Дальше вас ждут шейдеры, системы частиц, работа с сетью и процедурная генерация уровней. Но фундамент, который вы заложили в этом курсе, останется неизменным.

    Главный совет напоследок: заканчивайте игры. Лучше маленькая, но законченная игра с меню и звуком, чем грандиозный недоделанный проект. Удачи в разработке!