Приветствую вас, дорогие читатели, снова на своем канале! Надеюсь вы все уже прочитали первую часть данной статьи о движке для 2D игр - Game Maker Studio 2. Она была просто ознакомительной и в ней мы рассматривали общее устройство движка. Статья и так вышла не маленькой, по этому некоторые моменты пришлось перенести во вторую часть.
В данной статье я хотел бы более подробнее поговорить о игровых объектах и их событиях.
Игровые объекты
В прошлых своих статьях я уже не раз рассказывал, что вся игра состоит из объектов. Объектом может быть и главный герой, которым управляет игрок, и враги, и невидимые зоны в уровне (так называемые триггеры), и счетчик очков, кол-ва жизней и собранных монеток, и т.д. Т.е. по сути вся игра - это сборная солянка из объектов, которые так или иначе взаимодействуют между собой. Т.е. объекты можно смело назвать самой главной и основной частью любой игры.
В первой части статьи мы научились создавать объект и прикреплять к нему спрайт (т.е. изображение). Теперь давайте подробнее посмотрим, что еще можно делать с объектами и какие у них есть настройки.
Давайте пройдемся прям по порядку. Первой строкой идет поле "Name" (что в переводе означает "Имя"), тут мы задаем название своего объекта.
Далее идет поле "Sprite" (т.е. Спрайт) - это изображение для данного объекта. Тут же указаны размеры изображения. В примере со скриншота - 40 на 40 пикселей в ширину и высоту.
Эти два поля мы рассматривали в первой части статьи. А теперь давайте постараемся разобраться и понять, для чего же нужны остальные поля.
Далее идет "Collision Mask" (что переводится как "Маска Столкновений" или "Маска Коллизий"). Т.е. это та зона или область изображения объекта, которая будет взаимодействовать или сталкиваться с другими объектами. Грамотнее говорить - та часть, по которой будут обрабатываться коллизии. В примере выбрано значение "Same As Sprite" (что значит "такая же как и сам спрайт"). Чаще всего вы не будете менять этот параметр. Но что это значит?
Например, в моей игре герой может подбирать батарейки. Если бы маска столкновений была размером с сам спрайт, то только бы герой коснулся самого края батарейки, как она пропала. Но меня может не устраивать такой вариант. Я хочу, чтобы герой немного заходил "поверх" батарейки и только чтобы тогда она "сталкивалась" с героем и пропадала. Для этого я сделал маску столкновений квадратом, чуть меньше самого спрайта:
Видите этот темный квадрат в центре батарейки? Это и есть уменьшенная маска коллизий.
Т.е. если у нашего героя маска столкновений размером с сам спрайт (на скрине ниже выделил ее синим прямоугольником), то в первом описанном случае (при маске коллизий для батарейки размером с сам спрайт) батарейка бы пропадала уже при таком положении героя и самой батарейки (см.левую часть нижнего рисунка), т.е. едва они касаются гранями масок. Во втором описанном случае (когда маска коллиизии батарейки изменена на небольшой квадрат меньшим размером, чем сам спрайт) - батарейка бы пропадала при таком расположении героя и этой самой батарейки (см.правую часть нижнего рисунка) , т.е. в этом случае герой как бы заходит на нее сверху, и только так их маски коллизий пересекутся.
Если сразу с ходу вы не понимаете, то при разработке игры уже станет более ясно. Главное пока постараться понять, что коллизии (столкновения объектов) просчитываются не самими спрайтами (изображениями) а их масками. А сама маска уже может иметь различную форму и размеры (хоть квадратом, хоть окружностью, хоть самим спрайтом).
Давайте двигаться дальше. Ниже в настройках объекта есть четыре поля, в которых можно ставить и снимать галочки: Visible, Solid, Persistent, Uses Physics. В примере на скрине выше включена только "Visible".
Объясню опять же вкратце, чтобы сильно не затягивать статью.
1) Visible (что переводится как "Видимый"). Тут все просто, когда галачка стоит, то этот объект будет видно в игре. Когда ее нет, то соответственно объект будет невидимым. Как и для чего это используется уже расскажу потом.
2) Solid (что означает "Твердый"). Если галочка включена, то этот объект будет считаться "твердым" для других игровых объектов, т.е. непроходимым. По сути это используется в основном для объектов стен.
3) Persistent (что значит "Постоянный"). Дело в том, что когда мы заходим в уровень (комнату в GMS2), то все объекты создаются заново каждый раз. Т.е. если мы убьем всех врагов, выйдем из комнаты и вернемся в нее, то все враги заново создадутся на тех же местах. Так вот, галочка "постоянный" позволяет сделать объект как бы постоянным для всех комнат. Т.е. если мы убьем врага с этой галочкой. Затем выйдем и вернемся в уровень, то он уже не появится заново, потому что он независим от комнат. Ну тут тоже просто объяснить не получится. По ходу тоже поймете когда и где это можно использовать. Но чаще всего эта галочка у вас будет отключена.
4) Uses Physics (что переводится как "Использовать физику"). Поставив эту галочку для данного объекта включится встроенная система просчета реальной физики. Объяснить новичкам сложновато, но в GMS2 встроен физический движок Box2D (он использовался в таких играх как Angry Birds, например), который позволяет имитировать реальные законы физики. Т.е. у вас объекты будут подвержены гравитации, силам трения, центробежным силам и всему прочему: объекты будут падать, сталкиваться и т.д. как в реальном мире и все это будет просчитываться автоматически (ну с условностями конечно). Ну и поставить одну галчку недостаточно, нужно будет провести еще несколько манипуляций. Так что ее пока тоже трогать не будем. Вам для начала необходимо изучить основы. А к физике мы еще вернемся.
Далее идут 4 кнопки: Events, Parent, Physics, Variable Definitions.
1) Events (что переводится как "События") - это то место, где будет прописываться вся игровая логика объекта, его поведение и т.д. Т.е. с этой вкладкой вы будете работать 80% времени создания игры. Так что пока просто уясните для себя, что это важная вещь. Чуть ниже я к ней вернусь.
2) Parent (что переводится как "Родитель"). Тут мы можем задать родительский объект для текущего. Опять же для новичка пока это сложно понять и пока я не буду затрагивать эту вкладку. Просто знайте для чего она и держите это в голове. На начальных этапах обучения вы не будете ее использовать.
3) Physics (что собственно говоря и переводится как "Физика"). В данной вкладке настраиваются некоторые физические параметры объекта, такие как плотность, например. Но они будут учитываться только в том случае, когда у нас включена галочка Uses Physics о которой я писал выше. А так как мы договорились физику пока не трогать, то и эту кнопку тоже пока опустим. Описал вам просто для общего ознакомления.
4) Variable Definitions. Честно говоря, довольно удобная штука. Появилась только во второй версии GMS2. Объяснить людям без опыта тоже пока будет сложновато. Но по ходу обучения мы с вами обязательно к ней вернемся. Вкратце, она позволяет задать значения переменных для объекта прям в редакторе уровней. А зачем и для чего - уже объясню потом. Вы это тоже на начальных этапах использовать не будете.
Итак, вроде разобрали все поля настройки объектов. А теперь давайте наконец перейдем уже к самим событиям, т.е. Events.
События объектов
Так что же такое события и почему они так важны? А это собственно говоря те части объекта в которых мы с вами непосредственно будем писать игровой код.
Зачем событий несколько? И сколько их вообще? И для чего нужно каждое из них?
Это тоже очень обширная тема. В одной из статей (еслы вы конечно читаете их все по порядку, иначе научиться с нуля будет сложновато) помните я писал, что код читается циклически? Т.е. когда все строки кода будут прочитаны, то начнется заново чтение с первой строки до последней и т.д. И так может 30-60 раз в секунду. Об этом я подробно описывал в прошлых статьях, так что повторяться не буду. Так вот такое постоянное, циклическое чтение кода происходит в событии STEP (что переводится как "шаг").
Это одно из самых распространенных событий и в примере выше оно у меня тоже есть. На первом скриншоте с иконкой следов от ботинок.
Т.е. когда вы только создадите новый объект, то окошко с событиями (Events) будет пустым. Чтобы добавить событие, вам необходимо будет нажать кнопку "Add Event" (что значит "Добавить событие") и выбрать из открывшегося списка нужное вам. В данном случае это событие Step:
Все. Далее вы кликаете на само событие Step в окошке Events и у вас откроется еще одно окно, где собственно говоря мы уже и будем писать сам код:
Видите, в моем примере код в шаге очень короткий, всего 4 строчки. Но в некоторых объектах он будет гораздо больше.
Ладно, с одним событием разобрались. Но что если нам нужно выполнить код всего один раз, а не выполнять его постоянно? Для этого есть событие Create (что переводится как "Создать"). В моем примере оно тоже присутствует. Запомните, большая часть объектов как раз будут иметь два события: Create и Step.
Create - это событие создания объекта. Т.е. весь код, который вы напишете в этом событии, выполнится лишь один раз в момент создания объекта. Тут обычно задаются какие-то начальные переменные и т.д. Когда дойдем до обучения самому коду, я еще обязательно вернусь к данному событию.
Вообще, событий достаточно много и сразу рассказывать о всех я конечно не буду. Но если честно, то используется из них чаще всего лишь часть. Например, на моем скриншоте выше видно еще два события:
- событие Destroy (т.е. событие уничтожения объекта). Весь код прописанный тут будет так же выполнен лишь один раз, в момент, когда вы уничтожили объект. Как пример, у вас есть объект пули. При врезании в стену, т.е. когда их маски столкновении пересекутся (о чем мы говорили выше), пуля будет уничтожаться. А после уничтожения, мы хотим, чтобы появилось несколько искр. Вот их появление можно как раз прописать в событии уничтожения объекта пули.
- событие столкновения. Оно обозначено двумя стрелочками рядом с которыми нарисован объект, при столкновении с которым мы хотим выполнить какой-то код. Тут тоже все не сложно. Весь код, который мы пропишем в событие столкновения тоже будет выполняться циклически (как в событии step), но лишь до тех пор, пока маски объектов пересекаются (маска того бъекта в котором это событие и маска объекта, который мы укажем рядом со стрелочками). На примере той же описанной выше пули - в событии столкновения с объектом стены можно прописать кодом как раз уничтожение этой пули.
Думаю пока для одной статьи достаточно. Спасибо, что дочитали ее до конца! Это и правда наверное было не просто. Делитесь, ставьте лайки и не стесняйтесь спрашивать и задавать какие-то вопросы по игрострою и движкам GMS/GMS2 в частоности. Именно для этого я и пишу. До новых встреч.