Разработка игр в GameMaker Studio с нуля

Этот курс научит вас основам работы с движком GameMaker Studio и программированию на языке GML. Вы пройдете путь от установки программы до создания собственной полноценной игры и её экспорта.

1. Знакомство с интерфейсом GameMaker и создание первых ресурсов

Знакомство с интерфейсом GameMaker и создание первых ресурсов

Добро пожаловать в курс «Разработка игр в GameMaker Studio с нуля»! Если вы читаете эту статью, значит, вы решили сделать первый шаг к созданию собственной игры. GameMaker Studio 2 (GMS2) — это один из самых популярных и дружелюбных движков для создания 2D-игр. Он использовался для создания таких хитов, как Undertale, Hyper Light Drifter и Katana ZERO.

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

Философия GameMaker: Ресурсы и События

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

  • Спрайты (Sprites) — это картинки, визуальная оболочка. Без спрайта объект невидим.
  • Объекты (Objects) — это «мозги» игры. Они содержат логику и код. Объект использует спрайт, чтобы выглядеть как что-то конкретное.
  • Комнаты (Rooms) — это игровые уровни или экраны меню, где живут объекты.
  • Представьте, что вы ставите театральную пьесу. Комната — это сцена. Спрайт — это костюм. Объект — это актер, который надевает костюм и выполняет действия по сценарию.

    Обзор интерфейса

    Запустите GameMaker и создайте новый проект (New Project -> GameMaker Language -> Blank Game). Перед вами откроется рабочее пространство.

    !Основные зоны интерфейса GameMaker Studio 2.

    Давайте разберем основные элементы, которые понадобятся нам прямо сейчас:

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

    Обычно он находится справа. Это ваш «шкаф» со всеми материалами игры. Здесь лежат папки Sprites, Objects, Rooms, Sounds и другие. Все, что есть в вашей игре, должно быть создано здесь.

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

    Это центральная область. Она бесконечна. Когда вы открываете объект или скрипт для редактирования, он появляется здесь в виде окна. Вы можете перемещаться по этому пространству, зажав колесико мыши (или Пробел + ЛКМ).

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

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

    Шаг 1: Создаем Спрайт (Sprite)

    Любая игра начинается с визуализации. Давайте создадим нашего героя.

  • В Asset Browser найдите папку Sprites.
  • Нажмите на неё правой кнопкой мыши (ПКМ) и выберите Create -> Sprite.
  • Откроется окно редактора спрайта.
  • Правила именования

    В программировании крайне важен порядок. Договоримся сразу использовать «венгерскую нотацию» (префиксы). Для спрайтов мы будем использовать префикс spr_.

    > Назовите ваш спрайт spr_player.

    Если вы назовете его просто player, а потом создадите объект player, движок запутается. Имя spr_player сразу говорит нам: «это картинка игрока».

    Редактирование изображения

    В окне спрайта нажмите кнопку Edit Image. Откроется встроенный графический редактор. Нарисуйте простой смайлик или квадрат любого цвета. Не старайтесь сделать шедевр, сейчас нам важен сам факт наличия картинки.

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

    Это критически важный момент. Посмотрите на свойства спрайта (обычно слева в окне спрайта). Там есть параметр Origin.

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

  • Найдите выпадающий список Origin.
  • Выберите Middle Centre.
  • Теперь точка отсчета находится ровно в центре вашего рисунка.

    !Влияние точки Origin на вращение и позиционирование объекта.

    Шаг 2: Создаем Объект (Object)

    Картинка сама по себе ничего не умеет. Ей нужен «актер».

  • В Asset Browser найдите папку Objects.
  • Нажмите ПКМ -> Create -> Object.
  • Назовите его obj_player (префикс obj_ обязателен).
  • Перед вами откроется окно свойств объекта. Самое главное сейчас — связать объект со спрайтом.

    * Найдите поле, где написано No Sprite. * Нажмите на него и выберите ваш spr_player из списка (или просто перетащите спрайт из браузера ассетов в это поле).

    Теперь obj_player выглядит как spr_player, но пока ничего не делает. Это нормально.

    Шаг 3: Создаем Комнату (Room)

    Объекты существуют только внутри комнат.

  • В Asset Browser откройте папку Rooms.
  • Там уже должна быть одна комната по умолчанию, обычно она называется Room1.
  • Переименуйте её в rm_game (префикс rm_). Нажмите F2 или медленный двойной клик для переименования.
  • Дважды кликните по rm_game, чтобы открыть её. Вы увидите черное поле с сеткой.

    Слои (Layers)

    Слева в редакторе комнаты есть панель Layers. GameMaker использует слои, как Photoshop. По умолчанию там есть: * Instances — слой для игровых объектов. * Background — слой для заднего фона.

    Убедитесь, что выбран слой Instances (он подсвечен). Теперь перетащите ваш obj_player из Asset Browser прямо на игровое поле. Поставьте его в центр.

    Поздравляю! Вы только что создали свою первую игровую сцену.

    Запуск игры

    Настало время проверить результат. В верхней части интерфейса найдите кнопку Play (иконка треугольника, как на пульте) или нажмите клавишу F5.

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

    Резюме

    Сегодня мы освоили фундамент, на котором строится любая игра в GameMaker:

    * Asset Browser — место, где живут все ресурсы. * Спрайты (spr_) — это просто картинки. Важно настраивать им Origin (точку привязки). * Объекты (obj_) — это сущности, которые используют спрайты и содержат логику. * Комнаты (rm_) — это уровни, куда мы помещаем экземпляры объектов.

    В следующей статье мы заставим нашего персонажа двигаться, написав свой первый код на языке GML (GameMaker Language).

    2. Основы языка GML: переменные, логика и события объектов

    Основы языка GML: переменные, логика и события объектов

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

    Не пугайтесь слова «код». GML создан специально для разработки игр. Он прощает многие ошибки новичков и позволяет очень быстро увидеть результат. Сегодня мы разберем три кита, на которых держится программирование в GameMaker: События, Переменные и Логика.

    События (Events): Когда это происходит?

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

    Представьте, что объект — это работник офиса. Он сидит и ждет инструкций. Событие — это телефонный звонок.

    * Звонит телефон «Начало рабочего дня» — работник включает компьютер. * Звонит телефон «Обед» — работник идет есть.

    В GameMaker существует множество событий, но для начала нам нужны два самых главных:

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

    Это событие срабатывает один раз — в тот самый момент, когда объект появляется в комнате.

    Это идеальное место для «инициализации» — подготовки объекта к игре. Здесь мы задаем начальное здоровье, скорость, имя персонажа и количество патронов. Это как собрать рюкзак перед походом.

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

    Это сердце вашей игры. Игра — это не статичная картинка, это быстрая смена кадров. Обычно игра работает со скоростью 60 кадров в секунду (60 FPS).

    Событие Step срабатывает каждый кадр. То есть 60 раз в секунду GameMaker выполняет код, написанный внутри этого события. Здесь мы проверяем нажатия клавиш, двигаем персонажа и проверяем столкновения.

    !Визуализация разницы между Create Event (единоразово) и Step Event (циклично).

    Переменные: Память объекта

    Чтобы объект мог что-то запомнить (например, сколько у него жизней или с какой скоростью он бежит), ему нужны переменные.

    Переменная — это именованная ячейка памяти, в которой хранится значение. Представьте коробку, на которой маркером написано hp (здоровье), а внутри лежит бумажка с числом 100.

    Встроенные переменные

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

    * x — координата объекта по горизонтали. * y — координата объекта по вертикали. * image_angle — угол поворота спрайта (в градусах). * image_xscale / image_yscale — масштаб спрайта.

    Создание своих переменных

    Давайте создадим переменную для скорости игрока.

  • Откройте ваш obj_player.
  • В окне Events нажмите Add Event -> Create.
  • Откроется окно редактора кода. Напишите следующую строку:
  • Теперь наш объект «знает», что его скорость равна 4 пикселям. Мы создали переменную move_speed и присвоили ей значение.

    > Важно: Всегда давайте переменным понятные имена на английском языке. skorost — плохо, spd или move_speed — хорошо.

    Координатная сетка и Математика

    Прежде чем двигать персонажа, нужно понять, куда его двигать. Координатная система в GameMaker (и в большинстве 2D-движков) отличается от той, что вы учили в школе на уроках геометрии.

    !Координатная система GameMaker: Y увеличивается вниз.

    * Ось X: Направлена вправо. — движение вправо, — влево. * Ось Y: Направлена ВНИЗ. Это самое важное отличие. — движение вниз, — движение вверх.

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

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

    Где — новая координата, — текущая координата, а — скорость (наша переменная move_speed).

    Логика: Если -> То (If -> Then)

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

    Логика проста: ЕСЛИ нажата кнопка «Вправо», ТО увеличить x на move_speed.

    Пишем код движения

  • В obj_player нажмите Add Event -> Step -> Step.
  • В открывшемся окне напишите следующий код:
  • Давайте разберем этот код:

    * if (...) — начало условия. * keyboard_check(...) — функция, которая спрашивает у компьютера: «Нажата ли эта кнопка прямо сейчас?». * vk_right / vk_left — коды виртуальных клавиш (Virtual Key) стрелок на клавиатуре. * { ... } — фигурные скобки ограничивают действия, которые произойдут, если условие истинно.

    Добавляем вертикальное движение

    Помня о том, что ось Y перевернута, добавим движение вверх и вниз. Допишите в это же событие Step:

    Оптимизация кода

    Программисты — люди ленивые. Вместо того чтобы писать x = x + move_speed, мы можем использовать сокращенный оператор +=.

    * x += move_speed — то же самое, что x = x + move_speed. * y -= move_speed — то же самое, что y = y - move_speed.

    Практика: Запуск и проверка

    Теперь у вас есть объект obj_player, у которого:

  • В событии Create объявлена переменная move_speed.
  • В событии Step прописана логика движения по четырем сторонам.
  • Нажмите F5 (или кнопку Play), чтобы запустить игру. Попробуйте нажимать стрелки. Ваш смайлик (или квадрат) должен бодро бегать по экрану.

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

    Резюме

    Сегодня мы написали свой первый скрипт и оживили игру. Мы узнали, что:

    * Create Event используется для настройки объекта и создания переменных. * Step Event выполняется 60 раз в секунду и обрабатывает изменения. * Переменные хранят данные (например, скорость). * Ось Y в GameMaker направлена вниз. * Функция keyboard_check позволяет управлять игрой.

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

    3. Создание игровой механики: физика, коллизии и управление персонажем

    Создание игровой механики: физика, коллизии и управление персонажем

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

    Сегодня мы превратим этот прототип в полноценную игровую механику. Мы разберем, как работают столкновения (коллизии), улучшим код управления и реализуем так называемую «пиксельную» физику, которая используется в лучших 2D-платформерах и RPG.

    Проблема «Призрака»

    Вспомните наш код из прошлой статьи:

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

    Подготовка: Создаем препятствие

    Прежде чем врезаться в стену, нам нужна стена.

  • Спрайт: Создайте спрайт spr_wall. Залейте его любым цветом (например, серым). Размер 64x64 пикселя подойдет. Точку привязки (Origin) поставьте в Top Left (0,0) — для стен это удобнее, так как их проще расставлять по сетке.
  • Объект: Создайте объект obj_wall и назначьте ему спрайт spr_wall.
  • Комната: Откройте rm_game и расставьте несколько объектов obj_wall, создав лабиринт или коробку вокруг игрока.
  • Маска коллизии (Collision Mask)

    Как GameMaker понимает, что два объекта столкнулись? Он не смотрит на нарисованную картинку (пиксели). Он смотрит на Маску коллизии.

    Откройте спрайт игрока (spr_player). Слева в меню разверните вкладку Collision Mask. Вы увидите полупрозрачный прямоугольник поверх вашего рисунка. Это и есть «физическое тело» вашего персонажа.

    * Если маска меньше спрайта, персонаж сможет немного «заходить» в стены визуально. * Если маска больше, он будет застревать в воздухе рядом со стеной.

    Обычно маску оставляют прямоугольной (Rectangle), так как это быстрее всего просчитывается процессором.

    !Визуализация разницы между видимым спрайтом и невидимой маской коллизии, которая отвечает за столкновения.

    Улучшенное управление: Векторная логика

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

    В событии Step объекта obj_player удалите старый код и напишите следующий:

    Разбор переменных

    Обратите внимание на слово var.

    * Переменные, созданные через var (например, move_x), являются локальными. Они существуют только один кадр и только внутри этого куска кода. После выполнения события они стираются из памяти. * Переменные без var (как move_speed, которую мы создали в Create) являются переменными экземпляра и хранятся вечно.

    Мы используем var для ввода, потому что нам не нужно помнить, какую кнопку нажал игрок, в следующем кадре. Нам нужно это только здесь и сейчас.

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

    Где: * — итоговая скорость по оси X (наша переменная move_x). * — состояние клавиши «вправо» (1 если нажата, 0 если нет). * — состояние клавиши «влево» (1 если нажата, 0 если нет). * — скорость движения (move_speed).

    Если мы жмем вправо: . Персонаж пойдет вправо. Если мы жмем влево: . Персонаж пойдет влево.

    Логика столкновений: «Предсказание»

    Главное правило хорошей физики: Сначала проверяй, потом двигай.

    Мы не будем менять x сразу. Мы спросим у движка: «Если я перемещусь на move_x пикселей, врежусь ли я в obj_wall?».

    Для этого используется функция place_meeting(x, y, obj). * Она мысленно помещает объект в указанные координаты x, y. * Проверяет, пересекается ли его маска с объектом obj. * Возвращает true (да) или false (нет).

    Горизонтальная коллизия

    Добавьте этот код ниже в событие Step:

    Разбор алгоритма

    Это классический алгоритм идеальной коллизии.

  • if (place_meeting(x + move_x, ...)): Мы проверяем точку, где окажемся в конце кадра.
  • Если там стена, мы запускаем цикл while.
  • Функция sign(move_x) возвращает знак числа:
  • * Если move_x положительное (идем вправо), вернет 1. * Если отрицательное (идем влево), вернет -1.
  • Цикл while говорит: «Пока в одном пикселе от меня нет стены, я буду делать микро-шаги по 1 пикселю».
  • Как только мы коснулись стены, цикл прерывается, и мы ставим move_x = 0, чтобы финальное прибавление к координате не произошло.
  • !Иллюстрация работы цикла while: вместо телепортации внутрь стены, персонаж подходит к ней вплотную попиксельно.

    Вертикальная коллизия

    Логика абсолютно такая же, только меняем x на y и move_x на move_y.

    Итоговый код

    Весь код в событии Step вашего obj_player должен выглядеть так:

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

    Запустите игру. Попробуйте разогнаться и врезаться в стену.

    * Персонаж должен останавливаться ровно у края. * Не должно быть зазоров. * Вы можете скользить вдоль стены (например, жать «Вправо» и «Вниз» одновременно, двигаясь вдоль вертикальной стены).

    Это происходит потому, что мы обрабатываем оси X и Y независимо. Если стена блокирует движение по X, move_x становится 0, но move_y остается прежним, и персонаж продолжает двигаться вниз.

    Резюме

    Сегодня мы создали надежную базу для любой 2D-игры.

  • Мы узнали про Collision Mask — невидимую зону, отвечающую за физику.
  • Мы использовали локальные переменные (var) для промежуточных расчетов.
  • Мы реализовали векторное управление (right - left), которое чище и профессиональнее простых условий.
  • Мы написали алгоритм пиксельно-идеальной коллизии с использованием цикла while и функции place_meeting.
  • В следующей статье мы добавим в игру немного жизни: научимся работать со спрайтами, чтобы персонаж поворачивался в сторону движения и менял анимацию при ходьбе.

    4. Визуальное оформление, работа со звуком и интерфейсом пользователя

    Визуальное оформление, работа со звуком и интерфейсом пользователя

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

    В этой статье мы вдохнем в проект жизнь. Мы научим персонажа поворачиваться и менять анимации, добавим звуковые эффекты и выведем на экран интерфейс (HUD).

    Оживляем персонажа: Повороты и Анимация

    Сейчас наш герой всегда смотрит в одну сторону (обычно вправо), даже когда идет влево. Это выглядит неестественно. В GameMaker есть встроенные переменные, которые управляют отображением спрайта.

    Отражение спрайта (Flipping)

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

    * image_xscale = 1 — нормальный размер (смотрит вправо). * image_xscale = -1 — спрайт отражен по горизонтали (смотрит влево).

    !Иллюстрация того, как отрицательное значение масштаба зеркально отражает спрайт.

    Вспомните наш код движения из прошлой статьи. У нас есть переменная move_x, которая хранит скорость по горизонтали. Если она больше 0 — мы идем вправо, если меньше 0 — влево.

    Добавьте этот код в конец события Step объекта obj_player:

    Функция sign(move_x) возвращает знак числа: , или . Если мы движемся влево (скорость отрицательная), image_xscale станет , и персонаж повернется.

    Смена анимации (Sprite Index)

    Когда персонаж стоит, он должен дышать (анимация покоя, Idle). Когда бежит — перебирать ногами (анимация бега, Run).

    Для этого вам нужно создать два спрайта:

  • spr_player_idle (покой)
  • spr_player_run (бег)
  • За то, какой спрайт сейчас надет на объект, отвечает переменная sprite_index. Логика проста: если мы двигаемся (скорость не равна 0), включаем бег. Иначе — покой.

    Дополним наш код в событии Step:

    Теперь ваш герой будет автоматически переключать анимации в зависимости от действий игрока.

    Работа со звуком (Audio)

    Игры без звука воспринимаются мозгом как «сломанные». Даже простой звук шагов или прыжка кардинально меняет восприятие.

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

  • В Asset Browser найдите папку Sounds.
  • Нажмите ПКМ -> Create -> Sound.
  • Назовите звук, используя префикс snd_ (например, snd_step или snd_music).
  • В окне звука нажмите кнопку ... (три точки) рядом с полем имени файла и выберите .wav или .mp3 файл с вашего компьютера.
  • Воспроизведение звука

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

  • Sound ID: имя ресурса (например, snd_music).
  • Priority: важность звука (от 0 до 100). Если звуков слишком много, движок выключит те, у которых приоритет ниже. Для музыки ставьте 100, для шагов — 10.
  • Loop: зацикливание (true или false). Музыка должна играть по кругу (true), а звук удара — один раз (false).
  • Пример кода для запуска фоновой музыки (лучше всего писать это в событии Create объекта, который существует всегда, например, системного контроллера или самого игрока):

    Интерфейс пользователя (UI и HUD)

    HUD (Heads-Up Display) — это часть интерфейса, которая постоянно видна игроку: здоровье, патроны, очки.

    Новички часто пытаются рисовать текст прямо в событии Step или Create, но это не сработает. В GameMaker всё рисование происходит только в событиях группы Draw.

    Событие Draw GUI

    Существует два типа рисования:

  • Draw Event — рисует в игровом мире. Если камера сдвинется, текст останется на месте (как надпись на стене).
  • Draw GUI — рисует поверх всего, прямо на «стекле» монитора. Это идеально для интерфейса.
  • !Визуализация разницы координат: Draw привязан к комнате, GUI привязан к экрану.

    Давайте выведем количество очков на экран.

  • Создайте объект obj_hud (или используйте obj_player, но лучше иметь отдельный объект для интерфейса).
  • Добавьте событие Draw -> Draw GUI.
  • Напишите код:
  • Важное правило события Draw

    Если вы добавляете обычное событие Draw в объект (не GUI), GameMaker перестает автоматически рисовать спрайт этого объекта. Он думает: «Раз ты решил рисовать сам, то и спрайт рисуй сам».

    Если ваш персонаж исчез после добавления кода рисования, добавьте эту строку в начало события Draw:

    Для события Draw GUI это не требуется, так как оно работает независимо от основного слоя.

    Шрифты (Fonts)

    Текст по умолчанию выглядит мелким и пиксельным. Чтобы сделать красиво:

  • В Asset Browser -> Fonts -> Create -> Font.
  • Назовите шрифт fnt_gui.
  • Выберите реальный шрифт (Arial, Roboto и т.д.) и настройте размер.
  • В коде перед рисованием текста укажите:
  • Резюме

    Сегодня мы превратили «серый квадрат» в персонажа и добавили игре оболочку.

    * image_xscale позволяет зеркалить спрайты. * sprite_index меняет анимации. * audio_play_sound отвечает за звук. * Draw GUI — лучшее место для рисования интерфейса, который не должен уезжать за камерой.

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

    5. Отладка кода, финальная сборка проекта и публикация игры

    Отладка кода, финальная сборка проекта и публикация игры

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

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

    Что такое баг и как его найти?

    В программировании ошибку называют багом (bug). Баги бывают двух типов:

  • Синтаксические ошибки: Игра даже не запускается. GameMaker сразу пишет красным текстом, где вы забыли точку с запятой или скобку. Это самые простые ошибки.
  • Логические ошибки: Игра запускается, но работает неправильно. Персонаж проходит сквозь стены, здоровье не отнимается, или игра вылетает в случайный момент. Это самые коварные враги.
  • Для борьбы с логическими ошибками у нас есть два мощных оружия.

    1. Функция show_debug_message()

    Это самый простой и надежный способ понять, что происходит «в голове» у компьютера. Эта функция выводит текст или значения переменных в консоль (окно Output внизу экрана GameMaker), пока игра работает.

    Представьте, что у вас не работает стрельба. Вы нажимаете пробел, но ничего не происходит. Добавьте проверку:

    Запустите игру и нажмите пробел. * Если в консоли появилась надпись «Пробел нажат!», значит, кнопка работает, и проблема кроется в коде создания пули. * Если надписи нет, значит, игра вообще не регистрирует нажатие (возможно, вы отключили этот объект или условие if написано неверно).

    Вы также можете выводить значения переменных:

    2. Отладчик (The Debugger)

    Если show_debug_message — это скальпель, то Debugger — это томограф. Он позволяет остановить время в игре и посмотреть состояние всех переменных в конкретный момент.

    Чтобы запустить игру в режиме отладки, нажмите не обычную кнопку Play, а кнопку с изображением жука (или клавишу F6).

    #### Точки останова (Breakpoints) Главный инструмент отладчика. Откройте любой скрипт и нажмите клавишу F9 (или кликните левой кнопкой мыши на поле слева от номера строки). Появится красный круг. Это Breakpoint.

    Когда игра дойдет до этой строки кода, она встанет на паузу. Откроется окно отладчика, где вы сможете:

    * Увидеть текущие значения всех переменных (Local, Instance, Global). * Проходить код пошагово (кнопка Step Into), наблюдая, как меняются данные строка за строкой.

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

    Настройка игры (Game Options)

    Перед тем как отдавать игру друзьям, нужно привести её в товарный вид. Никто не хочет играть в игру с названием «Project1» и стандартной иконкой GameMaker.

    В Asset Browser найдите кнопку Game Options (иконка шестеренки).

    Основные настройки (Main)

    Здесь вы задаете частоту кадров. Стандарт для современных 2D-игр — 60 FPS (Frames Per Second). Убедитесь, что это значение установлено.

    Настройки платформы (Platform Settings -> Windows)

    Если вы делаете игру для Windows, зайдите в этот раздел. Здесь важно настроить:

  • Display Name: Имя, которое будет отображаться в заголовке окна (например, «Super Space Hero», а не «GameMaker Project»).
  • Icon: Загрузите свою иконку (файл .ico). Это «лицо» вашей игры на рабочем столе пользователя.
  • Splash Screen: Картинка, которая показывается при загрузке игры.
  • > Не забывайте менять версию игры (Version) при каждом крупном обновлении, например, с 1.0.0 на 1.0.1. Это поможет игрокам понять, что вы исправили ошибки.

    Финальная сборка (Compiling)

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

    В правом верхнем углу интерфейса найдите кнопку Create Executable (иконка пакета/архива) или нажмите Ctrl + F8.

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

  • Installer (NSIS): Создает файл setup.exe. Игроку придется устанавливать игру, как серьезную программу. Это выглядит профессионально, но для маленьких инди-игр часто избыточно.
  • Zip: Создает обычный .zip архив, внутри которого лежит .exe файл и все ресурсы. Это лучший выбор для начинающих. Игрок просто распаковывает архив и играет. Это называется «Portable» версия.
  • Выберите Zip, укажите папку для сохранения и подождите. GameMaker скомпилирует весь ваш код, упакует спрайты и звуки, и через минуту у вас будет готовый архив.

    Публикация игры

    Файл у вас на руках. Где его разместить?

    Itch.io

    Это самая дружелюбная платформа для инди-разработчиков.

  • Зарегистрируйтесь на сайте.
  • Нажмите Upload New Project.
  • Загрузите ваш .zip файл.
  • Добавьте скриншоты и описание.
  • Установите цену (или выберите «No payments», чтобы игру можно было скачать бесплатно).
  • GX.games

    GameMaker имеет встроенную поддержку платформы GX.games от Opera. Вы можете загрузить игру туда прямо из движка, выбрав цель Opera GX в правом верхнем углу. Игра будет работать прямо в браузере, и игрокам даже не придется ничего скачивать.

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

    Мы прошли огромный путь. Вы начали с пустого экрана и закончили готовым приложением.

    Что делать дальше? Практикуйтесь. Сделайте клон Pong, Breakout или Flappy Bird*. Не пытайтесь сразу делать MMORPG. * Читайте документацию. Нажатие на колесико мыши по любой функции в коде открывает справку. Это ваш лучший учебник. * Участвуйте в Джемах (Game Jams). Это соревнования, где нужно сделать игру за 48 или 72 часа. Это лучшая школа разработки.

    Разработка игр — это сложное, но невероятно увлекательное хобби, которое может стать профессией. Удачи в ваших проектах, и пусть ваш код компилируется без ошибок!