⚠️ Обращайте внимание на даты.
Этот блог больше не ведётся с 17 января 2023, и на тот момент с написания этой страницы (08.06.2013) прошло 9 лет.
Изначально создававшийся для создания анимации Марком Овермарсом, GameMaker перерос в целый игровой движок, способный работать на целом ряде платформ, и сейчас поддерживается целой организацией опытных разработчиков YoYo Games. Когда-то Game Maker, ныне GameMaker. Сейчас среди всех доступных средств для разработки его можно отнести к “игровым конструкторам общего назначения”.
Он не ограничивает вас конкретным жанром игры. Чем это плохо? Почти всю игровую механику вам придётся вписывать самостоятельно. Зато написать на фоне всей этой дребедени что-то своё, чего никто раньше не делал, вы сможете без труда. Особенно это занятие облегчает наличие встроенного скриптового языка. На самом деле, без этого языка многое сделать либо просто нереально, либо слишком долго.
Перед тем, как мы начнём… Если вы хотите научиться пользоваться GameMaker с нуля - вы попали не по адресу. Учить GML имеет смысл только после освоения всего интерфейса, и хотя бы прочтения справки по действиям. Написать несколько игр (не серьёзных, разминочных) на нём тоже желательно, просто чтобы свыкнуться с основными принципами. В общем, в рамках этого цикла я буду считать, что вы знаете о каждом виде ресурсов в GameMaker (а именно спрайтах, комнатах и объектах - остальное можно разобрать и далее), а также умеете писать несложные действия с событиями. То есть, по сути, знаете всё, кроме языка. Или представляете, как это работает.
Всё ещё с нами? Хорошо, поехали!
Переменные
Почти все скрипты вертятся вокруг “переменных”. Переменная - некая информация, хранящаяся в известном месте. Для компьютера это адрес в оперативной памяти, а для вас - это имя переменной. Есть ряд системных переменных, но для написания сложных программ вам придётся использовать немало собственных. И придумывать им имена нужно с умом.
Не рекомендую использовать в них ничего, кроме латинских букв и знака _. Даже цифры. Их можно использовать лишь с тем условием, что название начинается не с цифры. Ещё стоит отметить, что “Vari” и “vari” - разные названия. Дальнейшие правила, которых я советую придерживаться, я расскажу позже - когда будем обсуждать написание скриптов.
А, и вот ещё. GML нещадно карает за любые опечатки. Пишите внимательно.
В GML значения у переменных могут быть всего двух типов (иначе говоря, в GML два типа данных). Это числа и текст. Если вы используете переменную, у которой значения ещё нет, а потому и тип её значения неизвестен - высветится ошибка. Это примерно как диалог:
— Дай мне авокадо!
— А что такое авокадо?
PS: да, наверное, меня можно назвать гурманом.
Также есть три типа видимости переменных: локальные, поля и глобальные. О том, как их создавать - позже, сейчас лишь различия:
-
Локальные исчезают сразу после того, как закончился кусок кода с их участием. Нужно специально указать в начале участка кода, что переменная локальна. Они нужны лишь тогда, когда хранение числа нужно лишь в данном участке.
-
Поля принадлежат объектам, и в каждом объекте свой экземпляр поля, со своим значением. Можете хранить в объектах что угодно при помощи полей. Этот тип видимости используется всегда, если не указано иное, также есть целый ряд подобных переменных в самом GM, в каждом объекте. Вполне очевидно, что каждый объект знает, где он находится, куда движется и с какой скоростью. А знания эти находятся в этих переменных:
x
y
speed
direction
. На самом деле, таких переменных гораздо больше, но сейчас нам это не понадобится. Если вы забыли какое-то название - подсмотрите в справке, потому что их такое огромное количество, что их бесполезно учить наизусть. Кое-что вы запомните сами в процессе работы, и этого вам, скорее всего, будет хватать. -
Глобальные доступны абсолютно всем абсолютно отовсюду. Из какого объекта вы бы к ней не обратились, вы получите одно и то же значение. В самом GM таких переменных тонна, и они описывают текущее состояние всей игры. К примеру, в
room
находится индекс работающей на данный момент комнаты,room_speed
содержит число шагов, выполняемых игрой в секунду (это число обычно30
, и указывается в настройках конкретной комнаты). Очевидно, в каждый конкретный момент эти характеристики одинаковы для всех.
Выражения
Выражения - это любые конструкции GML, выполнение которых оставляет после себя некоторое значение. Простейший пример: 2+2
, вычисление этого выражения даст результат 4
. Что-нибудь посложнее: 2+2*2
. Это 6 (обращаю внимание, не 8
!). Если GM встречает выражение в коде, он вычисляет его, и на место всего выражения, проще говоря, подставляет получившийся результат. Это никак не влияет на последующие попытки выполнить код - выражение вычисляется каждый раз, когда выполняется фрагмент кода, в котором оно находится. Сложновато звучит, но работает очень просто - программа ничего не запоминает без вашего указания, и даже одинаковые вещи будет считать раз за разом, если приказано.
В этом посте мы будем рассматривать только простейшие выражения - будем трогать только числа и знаки +
и -
. В следующем посте, когда узнаем о функциях, сможем конструировать более крутые и полезные выражения.
Одно замечание. Не надо делить на ноль. Это плохо.
Может показаться странным - но писать код на GML мы начнём не со скриптов. Прежде чем писать какие-то действия, надо научиться обрабатывать данные из переменных. Поэтому наши первые фрагменты GML будут выражениями, и будут попадать в места, где, казалось бы, коду не место. Потому что выражение само по себе никак не влияет на игру.
Есть ещё один способ использовать выражения - режим отладки. В левом верхнем углу GameMaker у вас есть две кнопочки, а в строке меню есть Run
.
Что делает первая опция, вы уже наверняка знаете, а что делает вторая - скорее всего, не поняли, если наугад попробовали. Она запускает игру в режиме отладки, и особенность этого режима - наличие окна с таблицей в два столбца. Первый столбец вы можете заполнять выражениями, второй столбец будет заполняться их значениями каждый шаг.
Удобный способ следить за происходящим. Как с помощью этого режима следить за объектами - обсудим позднее, когда будем думать о применении объектов внутри скриптов.
Если вы работали с GM, то уже наверняка знаете о действии “прыжок в указанные координаты” или “jump to given position”. Он будет нашим подопытным, поскольку в него можно прекрасно вписывать любые числовые выражения. Напомню, это действие мгновенно перемещает объект в указанную точку.
В GameMaker: Studio это действие называется просто “Jump to position”, и выглядит так:
Окно нашего подопытного устроено просто. Два поля для координат нужной точки, и галочка “Relative” (“Относительно”) внизу, а также переключатель “кому совершить действие” в верхней части. Наш первый эксперимент будет объяснять, как работает галочка “Relative”. Возможно, вы это уже знаете, но на ценность урока это не повлияет.
Одна из самых распространённых задач, которые решают начинающие - сделать движение персонажа. И сейчас всё меньше статей, которые делают это без кода. По большей части потому, что их авторам лень тратить время на сооружение пугающих конструкций из значков, когда это можно записать в две строчки. То, что обучающийся ни слова не поймёт из скрипта, для них неважно или неочевидно.
Немножко математики. Каждая точка в комнате обладает некоторыми координатами вдоль двух осей: x
и y
, измеряются они в пикселях. В каждом объекте есть эти переменные, и они содержат его положение в комнате. Ось Х направлена вправо, то есть, при увеличении х
объект сместится вправо, а при уменьшении влево. Ось Y же направлена вниз (не так, как принято на математических чертежах!) и увеличение y
сместит объект вниз (уменьшение, соответственно, вверх). Точка, где x=0 и y=0 - левый верхний угол комнаты. Если изменять эти координаты каждый шаг на одну и ту же величину, объект будет двигаться с постоянной скоростью.
Эксперимент I
Шаги, отмеченные флагом Опционально необязательны. Если вы понимаете, что произойдёт, выполнять их не нужно.
Приготовления:
- Создайте в GM новую пустую игру.
- Создайте комнату (просто комнату, пустую, без всего).
- Создайте один спрайт, загрузите в него что-нибудь небольшое, три экземпляра чего поместятся на экран.
- Создайте три объекта: пусть даже
object0
,object1
и (Опционально)object2
- Укажите им всем ваш единственный спрайт.
- Разместите по одному экземпляру каждого объекта в вашей комнате.
- Создайте в
object0
иobject1
событие “Стрелка вправо” из группы “Клавиатура”: - Опционально Своим любимым способом заставьте
object2
двигаться вправо со скоростью 1, когда нажата клавиша “вправо” (иначе стоять на месте).
Начинаем развлекаться!
Теперь содержательная часть. В указанное событие вставьте действие, которое мы обсуждали выше (Jump to position), со следующими параметрами:
- В
object0
поставьте галочку Relative, в поле “х” напишите1
, в поле “y” оставьте0
. - В
object1
не ставьте Relative, в поле “х” напишитеx+1
, в поле “y” оставьте ноль.
Запустите. Поймите, что происходит.
Очевидно, x+1
- выражение. Оно может быть и более сложным. Скажем, оно может зависеть от ширины комнаты: x+room_width/180
. Здесь room_width
- системная переменная, и она есть в справке, как и все прочие. В таком варианте - за 180 шагов к x
прибавится 180 раз наша дробь, то есть, прибавится ширина комнаты. А это означает, что объект сместится вправо на ширину комнаты за 6 секунд (180/30
). Если он стоит у левого края в самом начале, то при непрерывном удерживании клавиши “вправо” 6 секунд он уйдёт за правую границу. Чтобы увидеть эффект такого выражения, позапускайте игру с разной шириной комнаты.
На этом обсуждение простейших выражений, а вместе с ним и первый урок завершается. В следующем уроке поговорим уже о функциях и действиях, что позволит уже писать простейшие скрипты! На этом знакомство с GML ещё только начинается. По плану нам нужно освоить:
- функции
- сложные выражения
- действия
- простейшие скрипты
- языковые конструкции
- обращение к объектам
- управление ресурсами игры
Программа большая. Надеюсь, успею довести её до логического конца и не сдуться по дороге. Комментарии и вопросы по изложенному и будущему материалу всегда приветствуются!
Не переключайтесь!