GML
GML (сокр. от англ. Game Maker Language) — это скриптовый язык программирования, разработанный специально для использования в среде разработки компьютерных игр GameMaker (ранее — GameMaker Studio). GML является основным средством написания логики, управления игровыми объектами, обработки событий и взаимодействия с графическим, звуковым и физическим движками в рамках данной среды. Язык ориентирован на разработку двумерных (2D) игр и предоставляет как высокоуровневые конструкции для быстрого прототипирования, так и возможности для более тонкого контроля над игровым процессом.
История
GML был создан Марком Овермарсом (Mark Overmars) в конце 1990-х годов как часть программы GameMaker, изначально называвшейся Animo (1999 год), а затем Game Maker (2000 год). Первоначально язык представлял собой набор простых команд, встроенных в систему визуального программирования (drag-and-drop). Однако по мере развития среды разработки и усложнения запросов пользователей GML эволюционировал в полноценный скриптовый язык с поддержкой переменных, функций, массивов, циклов, условных операторов и собственной системы типов данных.
В 2012 году с выходом GameMaker Studio (версия 1.0) язык получил значительные обновления, включая поддержку структур данных (списки, карты, стеки, очереди), более мощные математические функции и улучшенную работу с графикой. В 2017 году была выпущена GameMaker Studio 2, в которой GML был расширен за счёт введения макросов, перечислений, анонимных функций (лямбд) и более строгой системы типов (опционально). В 2022 году с выходом GameMaker (переименованная версия без номера) язык продолжил развиваться, в частности, получил поддержку модулей и улучшенную интеграцию с внешними библиотеками.
Синтаксис и особенности
GML имеет синтаксис, близкий к языкам C-подобной группы (C, C++, Java, JavaScript), но с рядом упрощений и специфических конструкций, адаптированных для разработки игр. Основные особенности:
- Динамическая типизация: переменные не требуют явного объявления типа; тип определяется значением, присвоенным переменной.
- Чувствительность к регистру: имена переменных, функций и констант различают заглавные и строчные буквы.
- Отсутствие точек с запятой как обязательного элемента: в большинстве конструкций точка с запятой не требуется, хотя может использоваться для разделения инструкций в одной строке.
- Встроенные функции: язык содержит сотни встроенных функций для работы с графикой, звуком, вводом, физикой, сетью, файлами, строками, математикой и другими аспектами игрового движка.
- Событийно-ориентированная модель: код выполняется в ответ на события (создание объекта, столкновение, нажатие клавиши, отрисовка кадра и т.д.), что упрощает написание игровой логики.
Типы данных
GML поддерживает следующие основные типы данных:
- Числа: целые и вещественные (с плавающей точкой). Пример:
42,3.14. - Строки: последовательности символов, заключаются в двойные кавычки. Пример:
"Hello, world!". - Булевы значения:
trueиfalse(фактически являются числами 1 и 0). - Массивы: одномерные и многомерные, индексация начинается с 0. Пример:
arr[0] = 10. - Структуры данных: специализированные типы, такие как списки (
ds_list), карты (ds_map), стеки (ds_stack), очереди (ds_queue), приоритетные очереди (ds_priority) и сетки (ds_grid). - Объекты: экземпляры игровых объектов, создаваемые из ресурсов-объектов в редакторе GameMaker.
- Указатели: используются для работы с памятью и внешними библиотеками (например, через DLL).
Управляющие конструкции
GML включает стандартные управляющие конструкции, характерные для императивных языков:
- Условные операторы:
if,else,switch,case,default. - Циклы:
for,while,do...until,repeat. - Операторы перехода:
break,continue,exit.
Функции
Пользователь может определять собственные функции (скрипты) с помощью ключевого слова function (в современных версиях) или через создание скриптовых ресурсов в редакторе. Функции могут принимать аргументы и возвращать значения. Пример:
``gml function add(a, b) { return a + b; } ``
Применение
GML используется исключительно в среде разработки GameMaker для создания компьютерных игр, преимущественно двумерных. Язык позволяет реализовать:
- Игровую логику: управление персонажами, врагами, предметами, уровнями.
- Физику: симуляцию гравитации, столкновений, трения, упругости (как встроенными средствами, так и через физический движок Box2D, интегрированный в GameMaker).
- Графику: отрисовку спрайтов, анимаций, частиц, фонов, текста, а также использование шейдеров (GLSL ES) для визуальных эффектов.
- Звук: воспроизведение звуковых эффектов и музыки, управление громкостью, панорамированием.
- Ввод: обработку действий с клавиатуры, мыши, геймпада, сенсорного экрана.
- Сеть: многопользовательскую игру через локальную сеть или интернет (с использованием UDP, TCP, WebSocket).
- Работу с файлами: сохранение и загрузку игровых данных (прогресс, настройки, рекорды).
- Интеграцию с внешними сервисами: реклама, аналитика, таблицы лидеров, покупки внутри приложения (через расширения и SDK).
Примеры
Простейшая программа
Следующий код выводит сообщение в окно игры:
``gml show_message("Hello, GameMaker!"); ``
Управление движением объекта
Код, помещённый в событие Step (выполняется каждый кадр) объекта-игрока, реализует движение по нажатию клавиш:
``gml var speed = 5; if (keyboard_check(vk_left)) { x -= speed; } if (keyboard_check(vk_right)) { x += speed; } if (keyboard_check(vk_up)) { y -= speed; } if (keyboard_check(vk_down)) { y += speed; } ``
Функция для проверки столкновения
Пользовательская функция, возвращающая true, если два объекта пересекаются:
``gml function check_collision(obj1, obj2) { return place_meeting(obj1.x, obj1.y, obj2); } ``
Критика
GML, как и среда GameMaker в целом, подвергается критике за ряд недостатков:
- Производительность: интерпретируемый характер языка и архитектура среды могут приводить к снижению производительности в сложных проектах с большим количеством объектов и интенсивными вычислениями. Однако в последних версиях GameMaker была введена поддержка компиляции в нативный код (через YYC — YoYo Compiler), что значительно улучшает скорость выполнения.
- Ограниченность для 3D: GML не предназначен для создания трёхмерных игр; хотя существуют сторонние библиотеки и расширения, позволяющие работать с 3D-графикой, функциональность языка в этой области сильно ограничена по сравнению с профессиональными 3D-движками (Unity, Unreal Engine).
- Отсутствие строгой типизации: динамическая типизация упрощает написание кода, но может приводить к трудноуловимым ошибкам, особенно в больших проектах. В ответ на эту критику разработчики GameMaker ввели опциональный режим строгой типизации (в версии 2.3+).
- Зависимость от среды: GML не является самостоятельным языком; его использование невозможно вне GameMaker, что ограничивает переносимость кода и возможности разработчика.
Интересные факты
- На GML написано множество известных инди-игр, включая Hotline Miami (2012), Undertale (2015), Hyper Light Drifter (2016), Katana Zero (2019) и Celeste (2018). Последняя, в частности, получила высокие оценки критиков за геймдизайн и техническую реализацию.
- GML поддерживает вставку кода на других языках (например, C++ через DLL) и использование шейдеров на GLSL ES, что позволяет расширять функциональность за пределы встроенных возможностей.
- В 2021 году компания YoYo Games (разработчик GameMaker) была приобретена компанией Opera Software, что привело к изменению лицензионной политики и модели распространения среды.
Источники
- Официальная документация GameMaker: GameMaker Manual (YoYo Games, 2023).
- Overmars, M. Game Maker: A Tool for Creating 2D Games. University of Utrecht, 2000.
- Форум сообщества GameMaker: GameMaker Community (раздел «GML Code»).
- GameMaker Studio 2: The Complete Guide (P. J. McSweeney, 2019).
- Статья «GML (Game Maker Language)» в англоязычной Википедии (версия от 15.01.2024).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →