Game maker обучение на русском. Различные видео уроки по программе game maker и game maker studio

В сегодняшнем уроке мы рассмотрим стандартные эффекты в Game Maker Studio 2. Какие они бывают, как их их использовать и какие тут есть подводные камни.

Продолжаю курс - Основы создания игр в Game Maker Studio 2

Прошлый урок вы можете найти вот тут:

О таких через стандартные эффекты даже не мечтайте:)

Стандартные эффекты в GMS лучше не использовать

Тут нужно сделать важное отступление. Стандартные эффекты в Game Maker Studio 2 не рекомендуется использовать для серьезных проектов по целому ряду причин.

Основная причина в том, что эффекты не очень хорошо оптимизированы в плане быстродействия. Стандартные эффекты могут очень сильно грузить программу (игру), так-как мы не знаем как они выполняют, но судя по всему, выполняются они не очень качественно.

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

Особенно опасно все эти эффекты пихать в шаги (step) и если у вас в игре частота смены кадров (FPS) 50-100. Игра будет в секунду их отрисовывать 50-100 раз, а если у вас они рисуются для 100-200 объектов сразу? Конечно тут всё повиснет.

Вообще, game maker довольно легко вешать, я делал кучу игр которые вешали мне комп. Например я делал симулятор вируса, и там когда вирусы сильно размножались, они мне его вешали.

Тянул ГМ примерно объектов 500, потом снижается FPS и вентилятор начинает работать так, что комп подлетает в воздух.

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

Часто с этим нет проблем так-как вы делайте простые игры, а компы у всех мощные. Но вообще, и особенно когда вы делайте игру на телефоны, этот момент нельзя игнорировать.

Сейчас скажу лишь что:

  • Избегайте прозрачности
  • Избегайте больших карт
  • Избегайте стандартных эффектов ГМС
  • Поменьше функций в шагах (step)

Хорошо, про это я сказал. Теперь, какие есть в гейм мейкер эффекты и как их вызывать?

Виды стандартных эффектов в GMS и как их вызывать

Доступно 3 функции:

  • effect_create_above(kind, x, y, size, colour); // создать эффект НАД
  • effect_create_below(kind, x, y, size, colour); // создать эффект ПОД
  • effect_clear // очистить и удалить эффекты

Я почти всегда использую effect_create_above, хотя иногда и требуется другой. Например лужу крови лучше нарисовать под объектом, хотя лучше так её вообще не рисовать...

kind - тип эффекта. Об этом чуть ниже.

x, y - понятно что такое, координаты. Где эффект создаём.

Про это читайте больше вот тут:

size - размер. Могут быть только 0, 1 и 2.

  • 0 - маленький
  • 1 - средний
  • 2 - большой


colour - цвет эффекта. Например: c_red, c_blue, c_green

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

Меня давно просили, но то времени не было, то еще что-то. Как вы наверное знаете у меня еще и дочка родилась. Но так как я сейчас в отпуске, то решил все таки уделить время и исполнить свое обещание-создать уроки по внедрению физики в Game Maker Studio. Со вступлением не буду затягивать. Сразу к делу.
Все обучение я разобью на серию уроков. От простейших основ в физике до соединений и прочего. Возможно что-то подобное уже есть в сети, но либо уроки не информативны, либо они на Английском. Иначе бы меня не просили создавать этот курс обучения. Эти уроки предполагают знание Game Maker Studio или того же Game Maker 8 хотя бы на среднем уровне. Итак, урок первый. Я назову его "Основы".
Для начала мы научимся создавать простейшие геометрические объекты, научимся задавать им определенные физические свойства и взамодействовать между собой.
Итак, нарисуем несколько спрайтов: квадрат и круг. Я думаю это не должно вызвать у вас определенных сложностей. Я рисовать не умею. Так что изображу схематически. Два спрайта, размером 32 на 32 пикселя. Один будет круглый баскетбольный мяч. Второй будет квадратной стеной. В спрайте мячика указываем Origin, .т.е. центр спрайта по координатам X=16 и Y=16, т.е. прям по середине рисунка. Можно просто нажать кнопку "Center" и все сделается автоматически.


Далее создадим два объекта, назовем их к примеру "Ball" и "Wall". Начнем с объекта стены, т.е. "Wall". После создания, редактируем этот объект. Итак, если мы хотим, чтобы объект приобрел физические свойства, то обязательно устанавливаем галочку "Uses Physics". Далее, т.к. этот объект является стеной, то он не должен падать как остальные объекты. Для этого параметр "Density", что означает "плотность", устанавливаем равным 0. Запомните, это одно из главных правил! Если без использования физики мы устанавливали галочку "Solid", чтобы объект стал стеной. То теперь это делать не нужно. Просто устанавливаем плотность равной нулю. Для чего нужны остальные параметры и что они означают я объясню чуть позже.


Далее нужно создать так называемую "маску столкновения". У нас есть такое окошко с надписью "Collision Shape" и выбор трех вариантов: Circle (что означает окружность или овал), Box (что означает квадрат или прямоугольник) и Shape (многоугольник). Так как у нас стена квадратная, то выбираем Box и нажимаем на кнопку "Modify Collision Shape".
В открывшемся окне, передвигая точки обводим границы объекта. Т.е. в физическом мире игры столкновения будут просчитываться именно по этим желтым линиям. Не важно какой у вас спрайт объекта и что на нем изображено, он может быть больше или меньше этого контура, но как уже написал-просчитываться столкновения будут именно по этому контуру.


С объектом стены мы закончили. Теперь делаем все то же самое для объекта мяча "Ball". Редактируем этот объект. Включаем галочку "Uses Physics", чтобы объект приобрел физические свойства. Т.к. мяч у нас будет двигаться, т.е. падать отскакивать и т.д., то плотность "Density" не нужно менять на 0. Оставим ее пока равной 0.5.


Далее выбираем маску столкновения по аналогии со стеной. Т.к. у нас мяч круглый, то выбираем "Circle" и в редакторе маски обводим контур.


Вот и все. Два объекта создано. Осталось только создать комнату и расставить объекты. И тут есть еще одна особенность. Объектам мы задали физические свойства. Теперь нужно включить физику в самом мире или проще говоря комнате. Для этого выбираем вкладку "physics" и устанавливаем галочку "Room is Physics World". Далее устанавливаем параметры физического мира. Вдоваться в подробности что это пока не буду. Просто выставите как на скриншоте. Можете поэксперементировать с этими числами и тогда объекты будут двигаться быстрее/плавнее или можно задать силу гравитации не вниз а в сторону, к примеру. Но как я уже сказал, пока эти значения не трогаем.Далее мы расставляем все объекты в комнате и запускаем "игру".


И... И тут мы видим, что мячик пролетает сквозь стену. Мы забыли указать, чтобы мяч сталкивался со стеной. Есть два способа. О втором поговорим чуть ниже. Сначала первый способ. Для этого опять заходим в объект мяча. Нажимаем кнопку "Add Event", т.е. добавить событие. В открывшемся окне выбираем "Collision", что значит столкновение, и выбираем объект "Wall". Т.е. мы указали, чтобы объект мяча сталкивался с объектом стены. И тут еще одна особенность GMS! Для того, чтобы он действительно сталкивались выбираем вкладку "Control" и переносим значок восклицательного знака в желтом треугольнике (т.е. комментарий) в поле "Actions". И в открывшемся окне пишем все, что угодно. Я напишу "Collision with Wall". По сути же совершенно не важно, что именно будет написанно в коментарии, но важно, чтобы он был, иначе столкновения мяча со стеной не будет.


Пробуем запустить еще раз. И вот мы видим, что все работает прекрасно. Но если к примеру вы хотите расставить несколько мячей в комнате, то заметите, что они сталкиваются только со стеной, но между собой никак не взаимодействуют. Т.е. мы хотим, чтобы мяч сталкивался с мячом. Тут работаем по аналогии. Заходим в объект мяча. Нажимаем кнопку "Add Event", выбираем "Collision", и выбираем объект "Ball", оставляем какой-нибудь комментарий, к примеру "Collision with Ball". Запускаем. Как видите все работает.
Но вы конечно же заметили, что мячи ведут себя как камни. Они не отскакивают от пола и стен. Вот тут и пришло время поговорить о физических свойствах объектов и их параметрах. Итак их у нас 6:
1) Density (что означает плотность). Чем выше это значение, тем "тяжелее" будет объект.
2) Restitution (можно перевести как восстановление). Т.е. как быстро будет ваш объект возвращаться в исходное состояние, а именно состояние покоя. Чем выше этот параметр, тем дольше объект будет успокаиваться.
Это именно тот параметр, что нам нужен чтобы заставить мяч отскакивать от пола. Установите его равным хотя бы 0.8 и увидите, что получилось.
3) Collision Group (или группа столкновений). Если вы хотите, чтобы объекты сталкивались между собой, то достаточно включить их в отдельную группу. К примеру, можно у объекта стены и мяча просто указать группу один, т.е. они будут находиться в одинаковой группе, тогда все события столкновений, что мы прописывали можно удалить из объектов. Они и так будут сталкиваться. Вот вам второй, более простой способ для указания столкновений для объектов. Вдоваться в подробности не буду. Но порой лучше использовать первый способ, описанный выше. В ходе практики сами поймете почему. Иногда нам просто нужно, чтобы первый объект сталкивался только со вторым, но не с третьим. А второй с третьим и т.д. Сложно понять по началу. Но в ходе создания игры, как я уже сказал, вы все поймете.
4) Linear Damping (Линейное затухание). Ну тут подробно останавливаться не буду. Скажу лишь, что чем выше число, тем быстрее объект будет "затухать", а точнее его скорость, можно и так сказать, чтобы упростить понимание. Просто поэксперементируйте и вы все поймете сами.
5) Angular Damping (Угловое затухание). То же самое, что и выше, только связанное с вращением. Не буду останавливаться.
6) Ну и последнее, Friction (что значит трение).Ну тут все просто. Это сила трения. Учите физику, господа. Скажу лишь, что с помощью этого параметра можно создавать такие поверхности, как лед к примеру.
На этом, я думаю, первый урок следует окончить. Я рассказал вам об основах физики в Game Maker Studio. Надеюсь этот урок поможет вам хоть немного понять и освоиться в этом на первый взгляд не простом деле. Во втором уроке я возможно расскажу вам о силах в физическом мире. В третьем о соединениях. Если что-то непонятно или вы бы хотели в уроках услышать что-то особенное, то оставляйте комментарии. Постараюсь включить это в уроки. Спасибо за внимание.

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

Вступление

Game Maker - это невероятно простой игровой движок, позволяющий создать игры для большого числа платформ - Windows, Mac OS X, Ubuntu, Android, iOS, Tizen, Windows Phone, Windows 8, PlayStation 3, PS 4, PS Vita, Xbox One и HTML 5. Есть поддержка SteamWorks. В случае успеха вашей игры, портирование на другую платформу сложной задачей не будет.

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

YoYoGames - компания, создавшая Game Maker, недавно была приобретена Playtech, что дает уверенность в том, что Game Maker продолжит развиваться. Анонсированный Game Maker 2.0 вероятно будет еще более дружественным и простом, а также логично предположить, что будет обладать еще большими возможностями. Как пишут в пресс-релизе, GM 2.0 - одна из причин покупки компании.

В этой статье я кратко расскажу о Game Maker и мы сделаем простой набросок будущего проекта.

Для кого этот движок и с какой целью его еще можно использовать?
Для всех. Цель - любая 2D игра. Однако для тех, для кого программирование не родная стихия, а так же для быстрого прототипирования и создания игры с минимальными усилиями для любого желающего делать игры и/или заработать на них, Game Maker подойдет идеально.

Плюсы Game Maker

- простое вхождение;
- знакомый всем по Java/C/C#… синтаксис;
- возможность легкой компиляции на разные платформы;
- активное сообщество, которое за многие годы уже решило много проблем и написало код за вас;
- стандартный функционал, благодаря которому не нужно самому писать большое количество кода;
- расширяемость через extension"ы;
- справка (F1) очень простая и удобная с отличными объяснениями и примерами.

Минусы Game Maker

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

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

Кратко пробежимся по структуре проекта:

  • Sprites - папка с спрайтами(изображения, анимации);
  • Objects - объекты со своими заготовленными событиями (например, создание, отрисовка, клик и т.д.);
  • Rooms - игровые комнаты (экраны). Для каждого экрана нужно делать свою комнату. Очень удобно;
  • Background - фоны, которыми можно залить комнату. Так же используется как tile set"ы
Остальное нас пока не интересует.

Что такое спрайт в Game Maker?

Это изображение/анимация, которые используются в игре. Они обладают своей маской, формы и размеры которой можно менять. Маска - это область изображения, которая реагирует на события столкновения объектов (если этот спрайт присвоен какому-то объекту), кликов по нему. Можно задать точку отрисовки (Origin) - например, от центра, угла или любой другой точки.

Так же для спрайта можно можно задать Texture Group. Нужно для оптимизации отрисовки (например, незачем держать в памяти texture pages с изображениями, которые используются на экране меню, когда у нас сейчас игровой экран). Для каждой Texture Group можно задать платформу, на которой они будут действовать. Например, для Android можно иметь менее детальные изображения, чем для Windows 8 планшетов.

Что такое объект (object) в Game Maker?

Это описание некоторой сущности, обладающая своими методами (функциями). Каждый объект рисует себя сам (если не задано иное), реагирует на стандартные события - нажатия клавиши, клика по спрайту и т.д… По аналогии с ООП - это класс (class).

Что такое инстанс (instance) в Game Maker?

Если объект - это просто описание сущности, то инстанс - это экземпляр объекта, его реализация в самой игре. Создав инстанс вы даете ему жизнь и теперь все события, описание которых есть в объекте начнут реагировать.
По аналогии с ООП - это объект (object).

Первое, что необходимо сделать - создать новую комнату (на левой панели правый клик на Rooms - Create Room). Назовем её rm_game. Зададим размеры окна во вкладке Settings - Width - 800, Height - 480, Speed - 60. Т.е. игра у нас будет происходить в окне 800х480, fps будет не превышать и стремиться к 60 кадрам. Сохраняем, закрываем.

Добавим несколько спрайтов. Правой кнопкой по папке Sprites -> Create Sprite. Назовем его spr_unit_shooter, загрузим картинку (есть на гитхабе в конце статьи), например, размера 54х54 и отцентрируем (кнопка Center). Кнопка «OK» и данные сохранились.

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

По принципу, аналогичному со спрайтами и комнатами, создаем пустой объект. Назовем его o_unit_parent и больше пока с ним ничего не делаем. Теперь создадим o_unit_shooter и в графе Parent выберем o_unit_parent. Зададим ему спрайт - spr_unit_shooter. Для этого воспользуемся кнопкой, которая находится под именем.

Называть спрайты, объекты, комнаты и т.д. можно как вам удобно, но для того, чтобы потом не путаться, лучше сразу называть вещи своими именами, например, спрайты с приставкой spr_, объекты obj_ или o_, скрипты - scr_ и т.д.

Теперь, каждый раз, когда вы будете создавать объект o_unit_shooter в комнате, он будет сам рисовать выбранный вами спрайт (конечно, если вы не переопределите это кодом).

Спрайт можно задавать и программно, но в таком случае он не будет отображаться в превью Project Structure слева. Теперь добавим событие, которое будет срабатывать при создании инстанса объекта. В этом событии нужно задать начальную инициализацию переменных, если они имеются. Нажмем Add Event. Как видите Game Maker позволяет каждому объекту отлавливать большое число событий. Нас интересует - Create.

Как видите справа в контейнере Actions в нескольких вкладках есть огромное количество drag"n"drop элементов, с помощью которых в теории можно создать совершенно полноценную игру не написав ни строчки кода. Но это для извращенцев и вероятно в Game Maker 2.0 этот ненужный функционал наконец уберут.

Перейдем по вкладку Control перетащим или сделаем правый клик по иконке Execute code. Откроется текстовый редактор, в котором и можно размещать игровую логику.

Как вы помните, юниты должны с определенным периодом стрелять. Сделать это можно очень легко. В событии Create напишем этот код: alarm = room_speed * 2;
Это означает, что мы запускаем alarm под номером 0, который сработает через room_speed*2 шагов(кадров). room_speed у нас равно 60, что примерно равно секунде. Так что alarm сработает через 120 кадров(2 секунды). alarm - это функция, а точнее событие объекта, она срабатывает как только счетчик шагов дойдет до 0. Как и все другие событие оно добавляется через Add event. Теперь нужно прописать логику, которую мы добавим в alarm, но прежде давайте создадим то, чем будет стрелять наше растение.

Создаем новый спрайт spr_bullet, размером 16х16 и центрируем. Теперь создаем новый объект o_bullet и задаем ему только что созданный спрайт. В событии Create добавляем код hspeed = 7; точно так же как и с предыдущим объектом. Этой строчкой мы задаем, что объект будет двигаться со скоростью 7 по горизонтали (hspeed = horizontal speed, если кто не понял). Это встроенное свойство каждого объекта. Присвоив ему ненулевое значение, этот объект начнет двигаться на заданное количество пикселей(в нашем случае по 7 вправо) каждый шаг(Step). Если мы зададим hspeed = -7; - объект будет двигаться по -7 пикселей каждый шаг, т.е. будет двигаться справа налево.

Все, возвращаемся к объекту o_unit_shooter и создаем новое событие - Alarm 0. Код, который мы напишем в этом событии как раз и будет срабатывать когда запущенный счетчик, который мы создали в событии Create. В событии Alarm 0 мы и будем создавать «пули» (в оригинале - горох), которыми стреляет растение. Добавим такой код:

/// shoot var b = instance_create(x + sprite_width/2, y, o_bullet); b.depth = depth + 1; alarm = room_speed * 2;
Разберем этот код.

/// shoot - это просто комментарий, который будет отображаться при переходе на событие. По-умолчанию показывается - «Execute piece of code», что не очень-то информативно. Так что рекомендуется писать такие комментарии, чтобы не тратить время на переход в редактор кода.
var b = instance_create(x + sprite_width/2, y, o_bullet);
var b - мы объявляем локальную переменную, которая будет доступна исключительно в этом событии. После завершения события память освободится и обратиться к этом переменной вы не сможете.
instance_create(x + sprite_width/2, y, o_bullet); - так мы создаем новый экземпляр объекта и помещаем его в координаты по x: x + sprite_width/2, по y - y. В данном случае x и y - это координаты материнского объекта - o_unit_shooter. o_bullet - это тот объект, который мы создаем.
b.depth = depth + 1; - эта строка означает, что только что созданный экземпляр o_bullet будет находится на 1 слой ниже чем o_unit_shooter.
Последняя строка означает, что мы снова запускаем alarm - растение же должно постоянно стрелять.

Как вы помните, в оригинале можно расставлять растительность только в определенных ячейках. Чтобы визуально было понятно в каких пределах можно поставить растение, создадим фон и зальем им нашу комнату. Правой кнопкой по Backgrounds - Create Background - Load Background, выбираем нужную картинку, скажем, 64х64 пикселя, обзываем bg_grass. Переходим в нашу комнату (rm_game), вкладка Backgrounds, выбираем созданный секунду назад фон. Ставим галочки, если не стоят как на изображении.

Теперь нам нужен какой-то стартовый объект, который будет делать начальную инициализацию. Создаем новый объект и называем его, например, o_game. Пусть этот объект и реагирует на клик по полю. Для этого добавим событие - Mouse -> Global mouse -> Global left released. Обычное mouse-событие означает непосредственный клик по объекту, но так как o_game не имеет своего спрайта+маски и т.к. нам нужно чтобы игрок мог кликнуть по любой точке игрового поля нужно отлавливать все события клика. Именно это и делает Global Mouse. Global left released означает, что где-то внутри игрового окна был сделан клик мышью или тач на сенсорном экране(событие срабатывает когда отпустили палец).

Добавим этому событию такой код:

Var tBgWidth = background_get_width(bg_grass); var tBgHeight = background_get_height(bg_grass); var iX = mouse_x - mouse_x % tBgWidth + tBgWidth; var iX = mouse_x - mouse_x % tBgWidth + tBgWidth/2; var iY = mouse_y - mouse_y % tBgHeight + tBgHeight/2; if (instance_position(iX, iY, o_unit_parent) != noone){ exit; } instance_create(iX, iY, o_unit_shooter);

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

В первых четырех строках мы объявляем локальные переменные. background_get_width, background_get_height - встроенные функции, возвращающие width и height нашего фона. Как видите эти данные нам понадобятся для того, что бы просчитать iX и iY. iX и iY - это будут координаты, в которых мы создадим экземпляр объекта o_unit_shooter. mouse_x, mouse_y - встроенные в Game Maker глобальные переменные (т.е. те, к которым мы может обратиться из любого места), хранящие текущие координаты курсора мыши (пальца). Т.к. мы работаем в событии Global left released, в них хранятся последние координаты где пользователь отпустил левую кнопку мыши (отпустил палец). Математические операции, результат которых присваиваются переменным iX, iY нужны для просчета координат, в которых экземпляр объекта o_unit_shooter будет находится ровно по средине ячейки фона bg_grass. Т.е. помните, что в Plants Vs Zombies растение нельзя поставить где угодно, только в определенной точке, но при этом кликнуть-то можно где угодно и растение поставится как раз в нужном месте. Этим и занимается весь код выше.

Проверка instance_position (iX, iY, o_unit_parent) != noone означает, что мы смотрим находится ли по координатам iX, iY любой инстанс (экземпляр объекта), родительским объектом которого является o_unit_parent. По скольку у нас сейчас только один наследуемый юнит - o_unit_shooter, то мы проверяем, нет ли экземпляров o_unit_shooter на игровом поле, но пишем o_unit_parent в проверке для того, чтобы код срабатывал и тогда, когда мы добавим новые пользовательские юниты. noone (от «no one») - некий аналог null в других языках.

Exit - код, который обрывает выполнение события. Т.е. если в координатах iX, iY какой-то юнит уже есть, срабатывает exit и инстанс o_unit_shooter не создается, т.к. мы прерываем выполнение всего последующего кода. Это нам нужно, чтобы в одной ячейке не могло стоять 2 пользовательских юнита.

Что ж, пришло время добавить первого врага. Создаем новый объект и опять же создадим базовый родительский объект. Назовем o_enemy_zombie и o_enemy_parent, который будет ему родительским. Создадим спрайт spr_enemy_zombie, отцентрируем и присвоим его o_enemy_zombie.

По сколько свойством всех врагов является движение в сторону растений, то создадим в o_enemy_parent в событии Create этот код:

CHspeed = -4; hspeed = cHspeed; HP = 10; canAttack = true;
cHspeed - это пользовательская переменная, значение которой мы присваиваем hspeed, с которой мы уже встречались. Почему просто не написать hspeed = -4; - увидите потом.

Ранее мы объявили пользовательские переменные через конструкцию var, но здесь мы этого не делаем. В чем же разница между cHspeed = -4; и var cHspeed = -4;?
Все просто - в первом случае переменная будет доступна из любой точки кода этого объекта и к ней можно будет обратиться из любого другого объекта, но только не забыв упомянуть, к какому именно объекту мы обращаемся. Сейчас вникать в это необязательно. Помним то, что эта переменная существует все время существования инстанса объекта с тех пор, как она объявлена. В случае же с var cHspeed = -4; она будет доступна только на время действия события, в котором она создана.

На самом деле к ней тоже можно обратиться из другого объекта, но в случае если вы обратитесь к ней из другого объекта в момент, когда событие, в котором она создана уже закончилось, это вызовет ошибку - знакомый всем null pointer, ибо из памяти она уже выгружена.

Если сам не нравятся функции hspeed, wspeed вы можете сами их реализовать изменяя значение x или y в событии Step. Эти функции просто делают это за вас.

HP - это еще одна переменная, в которой мы будем хранить количество очков жизни врагов. Этой переменной будет «владеть» каждый инстанс, но ведь максимальное количество очков жизни у разных типов врагов разные, т.е. нужно как-то переопределить/перезадать это значение. Либо можно задать всем врагам одинаковое количество жизней, скажем, 100 и ввести понятие defence от которой будет зависеть получаемый врагом урон, но сейчас нету смысла усложнять, верно? Так что обойдемся только одной переменной - HP.

Запомните, gml - язык, используемый в Game Maker регистрозависимый, HP, hP, Hp и hp - будут разными переменными.

CanAttack - просто переменная, которой мы присваиваем значение true(истина). Пока просто напишем и забудем о ней.

Раз у нас значение HP у каждого врага будет разное, нужно как-то переопределить это значение. Это очень-очень просто. Переходим к объекту o_enemy_zombie, создаем реакцию на событие Create и пишем код:

Event_inherited(); HP = 20;
Функция event_inherited(); и занимается наследованием. Т.е. теперь o_enemy_zombie выполнит код:

CHspeed = -4; hspeed = cHspeed; HP = 10;
Который «импортирует» эта функция, а затем значение выполнится строка - HP = 20;
Т.е. по факту на конец события Create объект o_enemy_zombie будет иметь такие свойства:

CHspeed = -4; hspeed = cHspeed; HP = 20;
Если же мы забудем о функции event_inherited(); или забудем объекту o_enemy_zombie указать родительский объект, враг двигаться не будет, при попытке обратиться к переменной cHspeed этого объекта появится ошибка.

Великолепно, если мы захотим создать еще один тип врага, в событии Create мы напишем тоже самое, изменив на нужно количество HP:

Event_inherited(); HP = 100;

Раз у зомби есть очки жизни, они должны быть и у растения. Добавьте самостоятельно в событие Create объекта o_unit_parent код HP = 20; и строку event_inherited(); в событие Create объекта o_unit_shooter.

А вы знаете?

Если вам не нужно ничего переопределять и дописывать в событии Create, добавлять код event_inherited(); без другой логики в событие не нужно - за вас это сделаем сам Game Maker. Тоже касается любых других событий, не только Create.

Отлично, наш зомби теперь идет, однако его не берут пули и растения его не тормозят. Решим сначала первую задачу. Перейдем в o_bullet и создадим новую реакцию на событие - Add Event -> Collision -> o_enemy_zombie. Это событие будет вызываться когда o_bullet и o_enemy_zombie врежутся друг в друга. Коллизия проверяется по маске, о которой вы читали в начале статьи. Добавим код:

With(other){ HP -= 5; if (HP <= 0){ instance_destroy(); } } instance_destroy();
Это очень интересный момент. other - это инстанс объекта, с которым в этот момент события происходит коллизия. Естественно, т.к. этот код находится в событии столкновения с экземпляром объекта o_enemy_zombie, то в other и будет только инстанс o_enemy_zombie.

С помощью конструкции with(){} мы обращаемся к этому элементу other. Все, что происходит внутри {} касается исключительно этого экземпляра объекта. Таким образом, HP -= 5; - это вычитание 5 очков жизни из врага. В if (HP <= 0){} мы сравниваем количество очков жизни тоже именно у этого объекта. Помните я немного выше говорил про разницу между обычным объявлением переменной и с переменной через var. Вот этот пример должен вам окончательно прояснить ситуацию. Т.к. переменная HP у нас объявлена не через var, то она доступна в любой момент времени. Так что с помощью конструкции with мы можем к ней получить доступ. Альтернативный способ обращения к переменной другого объекта выглядел бы так:

Other.HP -= 5; if(other.HP <= 0){ with(other){ instance_destroy(); } } } instance_destroy();
Но так обращаться к переменным менее удобно, особенно, если логики будет больше, но тем не менее в некоторых случая применимо.

Не забывайте, если вы объявили переменную не в событии Create, а в коде вы обращаетесь к ней до того, как она объявлена, это вызовет ошибку, если вы попытаетесь считать какие-то данные из нее.

Не нужно обладать большими знаниями английского, что бы понять, что функция instance_destroy(); удаляет этот экземпляр объекта(инстанс).

Таким образом весь этот код означает, что при коллизии мы отнимаем 5 очков жизни у зомби и если у него их становится 0 или меньше, то мы его уничтожаем. Независимо от результата в конце мы удаляем нашу пулю. Проще некуда. Вообще, наверное, лучше было бы заставить зомби самостоятельно следить за своим здоровьем, но пока нас это не интересует. Но это уже другая история вопрос оптимизации.

Было бы неправильно, если бы наши зомби могли только получать урон. Нужно же добавить возможность наносить урон. Прежде всего добавим новую переменную в событие Create объекта o_enemy_parent

IsActive = true;
Пришло время ознакомится с событием Step, о котором я ранее рассказывал. Данное событие срабатывает каждый кадр. Все просто. Если room_speed равно 60, то данное событие будет срабатывать примерно 60 раз в секунду. Добавим этот код в событие Step -> Step объекта o_enemy_zombie.

If (!isActive) exit; var tBgWidth = background_get_width(bg_grass); var leftCellCenterX = x - x % tBgWidth - tBgWidth/2; var frontEnemy = instance_position(leftCellCenterX, y, o_unit_parent); if (frontEnemy != noone){ var frontEnemySprtWidth; with(frontEnemy){ frontEnemySprtWidth = sprite_width; } if (x - sprite_width/2 - frontEnemy.x - frontEnemySprtWidth/2 <= 12){ hspeed = 0; if (!canAttack){ exit; } canAttack = false; alarm = room_speed * 1.2; // cantAttack -> true; with(frontEnemy){ HP -= 5; if (HP <= 0){ instance_destroy(); } } } }else{ hspeed = cHspeed; }

Ничего страшного в нем нет почти все конструкции вам уже знакомы.
if (!isActive) exit; - если объект не активен, т.е., скажем, отдыхает/перезаряжается/делает замах, данное событие выполнятся не будет. В следующих двух строках мы получаем координаты центра ячейки, находящейся слева от той, на которой сейчас находится центр нашего instance(помним, что x - возвращает координаты Origin-точки, а она у нас выставлена как раз по центру спрайта). Дальше мы смотрим, находится ли по координатам (leftCellCenterX, y) пользовательский юнит. Если там что-то есть происходит последующая логика, но о ней через секунду, если же там ничего нет, мы присваиваем hspeed значение переменной cHspeed, которую мы, помните, создаем в событии Create. Вот тут она и пригодилась. Смысл за этим скрывается такой - если наш зомби остановился для того, чтобы атаковать и уничтожил растение, нужно чтобы он продолжил свой путь. Можно, конечно, не вводить переменную cHspeed, но тогда нужно будет вспомнить где вы задаете скорость движения, а это забывается.

Это в случае если на пути зомби ничего нет, теперь же возвращаемся к моменту, когда нам предстоит бой. Первые же строки оказываются очень интересными, с подвохом. Дело в том, что объявив локальную переменную frontEnemySprtWidth мы в инстансе frontEnemy присваиваем ей значение. Знакомые с программированием, скажут, но ведь в таком случае мы обращаемся к переменной frontEnemySprtWidth не нашего зомби, а к переменной с таким же именем, но инстанса frontEnemy. Так да не так, дело в том, что локальные переменные(объявленные через var) становятся видимыми внутри этого события везде, даже изнутри инстанса frontEnemy. Таким образом в коде ошибки нет, мы действительно обращаемся именно к той переменной, которая была объявлена локальной внутри зомби. Если вы не поняли этого момента поэкспериментируйте или прочтите справку, там все прекрасно объяснено, а мы идем дальше.
Мы присвоили frontEnemySprtWidth значение длины(width) спрайта юнита пользователя(растения), который находится на ячейку левее нашего зомби. Вы скажете, а зачем нам городить такую сложную для первого понимания конструкцию, если можно обойтись var frontEnemySprtWidth = sprite_get_width(spr_unit_shooter);. Ответ прост - это сейчас у нас одно растение и мы знаем к какому спрайту обратиться, но при добавлении новых типов юнитов(подсолнухи и т.д.), придется городить громоздкую конструкцию switch, чтобы узнать что же за объект впереди нас, а так довольно просто решается эта проблемка.

Дальше мы проверяем, если расстояние между крайней правой точкой пользовательского юнита и крайней левой точкой нашего зомби меньше 12 пикселей, то мы останавливаем нашего зомби, проверяем может ли наш зомби атаковать(проверяем значение ранее созданной в событии Create объекта o_enemy_parent переменной canAttack), продолжается выполняться код, в котором мы говорим, что атаковать теперь уже нельзя и что следующий раз это можно будет сделать через room_speed * 1.2 кадров(через 60*1.2) - это мы делаем в alarm(сами добавьте его в соответствующее событие(Alarm 0) объекта o_enemy_parent, где напишите код canAttack = true;). Если атаковать можно, отнимаем у инстанса растения 5 очков жизни и проверяем, живо ли оно еще, если нет - уничтожаем.

Ну вот и отлично враг готов - он двигается, атакует и продолжает движение, если уничтожил растение, но у него есть один недостаток - его не существует. Мы создали только описание нашего врага, теперь нужно же помещать зомби на игровое поле. Возвращаемся в событие Create объекта o_game. Добавим код
alarm = room_speed; // generate enemies

Т.е. через 60 кадров сработает Alarm 0 и будет создан зомби, правильно? Нет. Мы же не создали логики для этого Alarm. А код тут тоже простой:

Var tBgHeight = background_get_height(bg_grass); var eY = irandom(room_height - room_height % tBgHeight); eY = eY - eY % tBgHeight + tBgHeight/2; instance_create(room_width + sprite_get_width(spr_enemy_zombie)/2 + 1, eY, o_enemy_zombie); alarm = room_speed * 3;
Все просто - мы не будем усложнять и просто каждые 3 секунды(60 кадра * 3) создаем инстанс o_enemy_zombie по координатам X: room_width + sprite_get_width(spr_enemy_zombie)/2 + 1 т.е. за ровно на один пиксель правее, чем граница экрана, т.е. зомби изначально видно не будет и Y - случайная ячейка. room_width и room_height, как вы уже поняли, это width и height нашей комнаты. Т.е. 800 и 480 соответственно.

Это все отлично, но инстанс объекта o_game тоже кто-то должен создать иначе весь эпизод смысла не имеет. Но наш завершающий шаг очень прост - переходим в комнату rm_game -> Objects -> выбираем в менюшке o_game и помещаем его где попало в комнате. Альтернативный вариант выглядит так - вкладка Settings -> Creation Code(- это код, который будет срабатывать когда мы переходим в эту комнату). Добавляем строку instance_create(0,0, o_game);

Координаты можно любые. Теперь мы можете задать вопрос, а как Game Maker определит, что нужно запускать комнату rm_game или «а что если у нас будет много комнат, с какой Game Maker начнет?». Все как всегда просто - самая верхняя комната запускается первой(их порядок можно менять перетягивая мышкой). Сейчас она у нас одна потому сразу она же и запустится.

Теперь у нас должно получиться что-то такое:

На этом первый эпизод закончен. Поздравляю, мы сделали прототип игры. Осталось совсем немного - сделать из него полноценную игру, чем и займемся в следующих частях.

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

Как видите по уроку, в некоторых планах текущая версия Game Maker не идеальна, многое приходится держать в голове, зато в Game Maker проще делать все остальное. Небольшое неудобство стоит того.

Game maker studio является хорошим кроссплатформенным движком-конструктором для создания 2D игр. Движок имеет очень простой и понимаемый интерфейс, но, если у вас возникнут сложности с его освоением, тогда вам поможет большое количество документации на русском языке, видео уроков и форумов по работе и созданию игр на данном движке.

Редактор Game maker Studio дает возможность создавать игры не только 2D игры, но и применять 3D графику. Стоит заметить, что возможность создания 3D игр не будет вас радовать крутой современной графикой или высокой степенью оптимизации, поэтому всё-таки данный движок стоит использовать как платформу для создания качественных 2D игр.

Движок позволяет создавать 2D игры с применением собственных спрайтов (графические объекты в компьютерной графике), звуков и анимации, которые так же можно создать и редактировать в Game maker studio.

Неотъемлемым плюсом редактора Game maker studio является кроссплатформенность – это способность создавать собственные игры для разных платформ для ПК (Windows, Mac OS, Ubuntu), мобильных (Android, Amazon Fire, iOS, Windows 10 Mobile), Web (HTML5) и Игровых консолей (Xbox One, PlayStation 4).

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

Для начинающих

Game maker studio подойдет для амбициозных людей с интересными идеями по созданию прототипа игры. Сейчас большая проблема хорошей идеи для создания игры является в её реализации, так как для этого необходимо знания языков программирования. Этот движок даёт возможность создания игры без прибегания к программированию, написанию скриптов.

Очень хорошо подойдет для первого тестового создания механики задуманной игры, так как главное для начала понять интересен ли будет сам gameplay, и только после тестирования можно будет приступать к подробному созданию и улучшению графической части игры. Вот для таких целей и подойдет Game maker studio, она даёт возможность быстро и легко реализовать такого рода задачу.

Drag and Drop (DnD ™) это графическая среда разработки, которая идеально подходит для начинающих или тех, кто более визуально или художественно ориентированы. С помощью DnD возможно создать игры без написания скриптов, используя только интерфейс программы.

Так же для начинающих в работе Game maker studio поможет русифицированный интерфейс, который можно найти на форумах этого движка. На официальном так же присутствует большое количество документации и инструкций по работе с движком.

Для профессионалов

Но не стоит говорить, что движок Game maker studio не будет интересен для профессиональных Game разработчиков. В Game maker studio есть свой собственный язык программирования GML, который написан на Delphi и имеет синтаксис он Java Script и Pascal. При создании игры с помощью GML языка программирования открывается на много больше возможностей нежели через графический редактор программы.

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

Последней версией Game maker studio №1 была 8.1.140, на сегодняшний день она перестала поддерживаться, так была выпущена новая версия Game maker studio 2.

Game maker studio 2 есть в свободном доступе на официальном сайте движка. Free версия можно скачать по ссылке https://www.yoyogames.com/get , она создана для бесплатного использования и с ограниченным количеством инструментов, но это не помешает вам в создании первого проекта. Для скачивания бесплатной версии необходимо зарегистрироваться на сайте.

Так же на официальном форуме можно скачать русификатор для движка.

После того как вы скачали и установили Game maker studio запускаем его и в окне вводим данные, которые зарегистрировали на официальном сайте при скачивании. После ввода данных нам открывается интерфейс движка.

Так как мы используем бесплатную версию программы, категория «Изучение» нам не будет доступна.

Для того, чтобы начать разработку игры, нажимаем на кнопку «Создать» и в следующем окне «Drag and Drop» после чего откроется окно, в котором нужно придумать название проекта и сохранить в удобное для вас место.

После того как откроется рабочее пространство, можно увидеть вкладки с правой стороны окна, где и будут сортироваться наши части игры.

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

При создании спрайта нам откроется меню создания, анимированные персонажа нашей игры. Тут можно полностью с нуля, попиксельно, нарисовать персонажа или же импортировать уже готового. Так же анимировать его, создать по кадровую анимацию действий персонажа.

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

Создание событий можно произвести без обращения к программированию и созданию скриптов, все делается с помощью довольно интуитивно понятных меню и окон. Можно продумать и создать довольно сложные сценарии действий для объекта с помощью визуального редактора Game maker studio.

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

Стоит заметить часть программы, в которой нам дается возможность работать с кодом на языке GML. Очень радует та легкость, с которой простые командные функции могут быть сделаны. Поэтому если вы начинающий Game creator и готовы посвятить этому большую часть времени, тогда вам просто необходимо заняться изучением языка GML.

Установка русификатора

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

После того как скачали файл русского языка, копируем его и вставляем в директорию с Платформой в папку «Languages» которая лежит по следующему пути C:\Program Files\GameMaker Studio 2\Languages
Открываем вставленный файл в блокноте, для этого нажимаем на него правой кнопкой и выбираем пункт «Изменить».

Откроется блокнот с конфигурацией этого файла. Нам необходимо 7-й строкой вставить следующую конфигурацию.

LanguageCode,ru,ru,standard windows os language code this pack represents (can be primary code only ie. en or primary-secondary ie. ru-RU)

Сохраняем файл и делаем бэкап стандартного файла «english», для этого просто скопируйте его в другую папку. Это необходимо для того, если что-то пойдет не так, просто скопировать его обратно и вернуть исходный язык движка. После сохранения русскоязычного файла удаляем старый англоязычный (предварительно сохраненный в другую папку) и запускаем Game maker studio.

Итоги обзора Game maker studio

Плюсы:

Минусы:

  • Плохо оптимизирован для некоторых платформ.
  • Плохо реализован инструмент создания 3D игр.
  • Нет встроенного русскоязычного интерфейса.
  • Большие ограничения при использовании бесплатной версии (на то она и бесплатная).

Заключение

Game Maker Studio - кроссплатформенный движок игр с легким освоением и подробной документацией. Программа предлагает интуитивно понятный и простой в использовании Drag-и-Drop (называется «DnD» теперь) Интерфейс «значки действий», которые позволят вам начать создавать свои собственные игры очень быстро. Вы можете импортировать и создавать образы и звуки для использования их в игре, а затем мгновенно увидеть результаты ваших действий при нажатии на кнопку. Следует отметить, что GameMaker: Studio заточен на двумерные игры, (но имеется так же базовая поддержка работы с 3d). С помощью D&D любой человек без знаний программирования может создать простенькую игру, на подобии Марио или Тетриса.

Конструктор Game Maker призван максимально упростить создание игр, чтобы у каждого пользователя появился шанс воплотить свои идеи в жизнь. По сравнению с классической разработкой игр, данная программа значительно облегчила данный процесс, но из-за его многогранности и сложности, сама превратилась в инструмент, требующий изучения.

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

Чтобы помочь вам быстрее овладеть инструментами Game Maker, мы собрали 2 сборника видеоуроков, где по шагам, наглядно, демонстрируется процесс создания игр.

Изучаем основы Game Maker

Базовый курс уроков Game Maker, поможет новичкам освоиться в программе и создать свою первую 2D игру. Автор видео подробно рассказывает, что нужно делать, как и зачем.

Учимся настраивать движение персонажей (влево, вправо, вниз и вверх).


Предназначение переменных в конструкторе Game Maker. Очень полезный урок.


Задаем параметр прочности (здоровья) для врагов.


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


Задаем своему персонажу уровень здоровья и выводим его на экран.


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


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


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


Задаем дистанцию для определенных объектов.


Чтобы объекты не пропадали за пределами окна, стоит заранее настроить область их движения.


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


Даем врагам возможность вести прицельный огонь по заданным целям.


Добавляем в игру окно инвентаря для хранения и использования виртуальных объектов.


Добавляем возможность сохранения данных игры в отдельный документ.


Подробное объяснение понятия “цикл” и примеры его использования в разработке игр.

Знакомимся с жанрами

Сборник уроков для любителей. В данных видеороликах демонстрируется процесс разработки игр разных жанров. На наглядном примере показывают, как создаются TDS-стрелялки, платформеры, раннеры, стратегии и редакторы карт.