Платформер на Construct 2. Враги персонажа (часть первая)

Мы продолжаем разработку нашего платформера. И сегодня речь пойдет о создании противников персонажа, которые будут наносить урон игроку при контакте с ними. Всего я расскажу о четырех видах противников, но конкретно в этой статье только о двух. Это будет первая часть данной темы.

 

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

 

Для более быстрого изучения Construct 2, рекомендую полностью проделать этот урок на своем компьютере. Для этого загрузите небольшой набор графики (139 Кб), который я использовал в уроке.

 

Приступим. Запускаем программу и открываем проект (FileOpen…) из прошлого урока.

Под врагов я создал небольшой второй уровень, использую спрайты оформления из первого. Кстати, некоторые пользователи присылали мне исходники и говорили, что на втором и последующих уровнях ничего не работает. А вся проблема была в том, что в параметрах макета нового уровня забывают подключить список событий levels. Так что будьте внимательнее!

 

Ползающий монстр

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

Платформер на Construct 2. Враги персонажа (скриншот 1)

В редакторе спрайта загружаем изображение первого монстрика из нашего набора.

Платформер на Construct 2. Враги персонажа (скриншот 2)

Затем немного подредактируем маску столкновений. Открываем инструмент Set collision polygon и поднимаем нижнюю точку на пару пикселей вверх. Конечно, это делать совсем не обязательно, но так монстр будет более плотно прилегать к платформе.

Платформер на Construct 2. Враги персонажа (скриншот 3)

Закрываем редактор и размещаем персонажа на нужной платформе.

Далее добавляем к монстру поведение Platform.

Платформер на Construct 2. Враги персонажа (скриншот 4)

По настройкам поведения. Уменьшаем максимальную скорость (Max speed) передвижения монстра, незачем ему носиться по уровню. И обязательно отключаем стандартное управление (Default controls) объектом с клавиатуры.

Платформер на Construct 2. Враги персонажа (скриншот 5)

Теперь мы должны ограничить передвижения монстра. Сделать это проще всего с помощью дополнительного спрайта. Добавляем новый объект и называем его limiter.

Платформер на Construct 2. Враги персонажа (скриншот 6)

В редакторе спрайта нажимаем на кнопку Resize и уменьшаем размер до 16 на 64 пикселя. Просто большой размер тут не нужен.

Платформер на Construct 2. Враги персонажа (скриншот 7)

Затем заливаем спрайт каким-либо цветом. Желательно, чтобы он не сливался с цветом платформ.

Платформер на Construct 2. Враги персонажа (скриншот 8)

Закрываем редактор и размещаем ограничитель слева от монстра. Чтобы игроки не видели расставленные ограничители, в параметрах (Initial visibility) устанавливаем невидимость объекта.

Платформер на Construct 2. Враги персонажа (скриншот 9)

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

 

Добавляем переменную для объекта limiter. Называем ее type, тип текстовый, а начальное значение left (слева).

Платформер на Construct 2. Враги персонажа (скриншот 10)

Теперь создаем копию объекта и размещаем ее по правому краю от монстра. В переменную записываем значение right (справа).

Платформер на Construct 2. Враги персонажа (скриншот 11)

Также нам понадобится переменная для монстра, чтобы настраивать движение. Называем переменную direction, тип текстовый, начальное значение forward (вперед). Чтобы нам не путаться с одинаковыми значениями переменных, здесь будем вместо влево/вправо использовать вперед/назад.

Платформер на Construct 2. Враги персонажа (скриншот 12)

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

 

Добавляем новое событие (Add event):

Условие: объект monster_1 → Compare instance variable → в Instance variable выбираем переменную direction, в Comparison выбираем Equal to (равно), в Value вводим «forward» (в кавычках) → Done

В этом условии проверяется, равна ли переменная монстра значению forward (вперед).

 

Напротив добавляем действия (Add action):

Действие 1: объект monster_1 → Simulate control → в Control выбираем Right → Done

Действие 2: объект monster_1 → Set mirrored → в State выбираем Mirrored → Done

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

 

Оставляем комментарий: Движение монстра направо.

 

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

 

Сразу же добавляем (Add event) аналогичное событие для движения влево:

Условие: объект monster_1 → Compare instance variable → в Instance variable выбираем переменную direction, в Comparison выбираем Equal to (равно), в Value вводим «back» (в кавычках) → Done

 

Добавляем действия (Add action):

Действие 1: объект monster_1 → Simulate control → в Control выбираем Left → Done

Действие 2: объект monster_1 → Set mirrored → в State выбираем Not mirrored → Done

 

Оставляем комментарий: Движение монстра налево.

Платформер на Construct 2. Враги персонажа (скриншот 13)

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

 

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

Добавляем новое событие (Add event):

Условие 1: объект monster_1 → On collision with another object → в Object выбираем объект limiter → Done

Условие 2: объект limiter → Compare instance variable → в Instance variable выбираем переменную type, в Comparison выбираем Equal to (равно), в Value вводим «left» (в кавычках) → Done

В первом условии проверяется, коснулся ли монстр ограничителя. А во втором условии проверяется, имеет ли этот ограничитель переменную со значением left (слева).

 

Добавляем действие (Add action):

Действие: объект monster_1 → Set value → в Instance variable выбираем переменную direction, в Value вводим «forward» (в кавычках) → Done

В этом действии в переменную монстра записывается значение forward (вперед).

 

Полностью событие звучит так: когда монстр касается левого ограничителя, в переменную направления записывается forward (вперед).

 

И создаем аналогичное событие для правого ограничителя. Тут уж я расписывать подробно не буду. В условии проверяем по значению right, а в действии записывается back (назад).

 

Оставляем комментарий для двух последних событий: Смена направления движения монстра.

Платформер на Construct 2. Враги персонажа (скриншот 14)

Проверяем промежуточный результат:

Платформер на Construct 2. Враги персонажа (скриншот 15)

Отлично. Теперь давайте добавим потерю одной жизни при контакте персонажа с монстром.

Добавляем новое событие (Add event):

Условие 1: объект player → On collision with another object → в Object выбираем объект monster_1 → Done

Условие 2: объект player → Is on floor → Done

В первом условии проверяется, коснулся ли персонаж монстра. Во втором условии проверяется, находится ли персонаж на платформе.

 

Для чего тут второе условие? Ниже мы добавим уничтожение монстра при прыжке на него сверху. Если не использовать такое условие, то пользователь при любом касании будет терять жизнь. А так быть не должно. Когда монстр уничтожается, жизни должны оставаться не тронутыми!

 

Добавляем действия (Add action):

Действие 1: объект player → Subtract from → в Instance variable выбираем переменную lives, в Value вводим 1 → Done

Действие 2: объект player_animation → Restart fade → Done

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

 

Оставляем комментарий: Потеря жизни при контакте с монстром.

Платформер на Construct 2. Враги персонажа (скриншот 16)

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

 

Проверяем промежуточный итог:

Платформер на Construct 2. Враги персонажа (скриншот 17)

То, что нужно. Теперь по уничтожению врага. Как я уже сказал, мы будем прыгать на него сверху и уничтожать. Для этого монстра у нас нет никаких дополнительных анимаций (расплющенный или что-то вроде того). Поэтому предлагаю добавить сторонний эффект. Поискав в интернете, я нашел вот такой пшик:

Платформер на Construct 2. Враги персонажа (скриншот 18)

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

Создаем новый Sprite и называем его zilch.

Платформер на Construct 2. Враги персонажа (скриншот 19)

В редакторе спрайта щелкаем правой кнопкой мыши в окне Animation frames и выбираем пункт Import framesFrom sprite strip.

Платформер на Construct 2. Враги персонажа (скриншот 20)

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

Платформер на Construct 2. Враги персонажа (скриншот 21)

Подтверждаем. И программа автоматически разобьет файл на 10 фрагментов. Кстати, останется пустой нулевой кадр. Не удаляем его, а переносим на последние место. Тогда эффект по завершению будет полностью исчезать.

Платформер на Construct 2. Враги персонажа (скриншот 22)

По умолчанию скорость проигрывания анимации установлена на 5 кадров в секунду. Это никуда не годится, слишком медленно, а должно быть плавно. Поэтому увеличиваем значение (Speed) до 15 кадров в секунду.

Платформер на Construct 2. Враги персонажа (скриншот 23)

Закрываем редактор и размещаем объект где-нибудь за пределами макета. И чтобы он там не висел и не занимал память, добавляем к нему поведение Destroy Outside Layout (уничтожит объект после создания).

Платформер на Construct 2. Враги персонажа (скриншот 24)

Возвращаемся в список событий и создаем новое (Add event):

Условие 1: объект player → On collision with another object → в Object выбираем объект monster_1 → Done

Условие 2: объект player → Is falling → Done

Первое условие, опять же, проверяет контакт персонажа с монстром. Во втором условии проверяется, падает ли персонаж (то есть приземляется на монстра сверху).

 

Добавляем действия (Add action):

Действие 1: объект System → Create object → в Object to create выбираем объект zilch, в Layer выбираем слой «objects» (в кавычках), в X вводим monster_1.X, в Y вводим monster_1.Y → Done

Действие 2: объект monsters_1 → Destroy → Done

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

 

Оставляем комментарий: Уничтожение монстра.

Платформер на Construct 2. Враги персонажа (скриншот 25)

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

 

Проверяем результат:

Платформер на Construct 2. Враги персонажа (скриншот 26)

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

 

Летающий монстр

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

 

Создаем новый Sprite и называем его monster_2. В редакторе спрайта загружаем два кадра анимации полета. В параметрах стандартной анимации устанавливаем скорость проигрывания на 7 кадров в секунду и активируем постоянное повторение.

Платформер на Construct 2. Враги персонажа (скриншот 27)

Затем добавляем новую анимацию и называем ее Fall (падение). Загружаем два кадра поверженного монстра. В параметрах анимации устанавливаем скорость проигрывания на 5 кадров в секунду и также устанавливаем постоянное повторение.

Платформер на Construct 2. Враги персонажа (скриншот 28)

Закрываем редактор и добавляем к монстру поведение Platform.

Платформер на Construct 2. Враги персонажа (скриншот 29)

По параметрам поведения. Уменьшаем максимальную скорость (Max speed), чтобы монстр был помедленнее, чем персонаж. Обнуляем гравитацию (Gravity), чтобы монстра не тянуло к земле. И отключаем стандартное управление (Default controls) с клавиатуры.

Платформер на Construct 2. Враги персонажа (скриншот 30)

Далее копируем ограничители от первого монстра и расставляем их по краям.

Платформер на Construct 2. Враги персонажа (скриншот 31)

Затем добавляем переменную для летающего монстра. Название (direction), тип (Text) и значение (forward) точно такое же, как и у ползающего монстра.

Платформер на Construct 2. Враги персонажа (скриншот 32)

Переходим в список событий. Создаем события для движения монстра направо и налево. В отличии от первого монстра, здесь зеркальное отображение (Not mirrored и Mirrored) нужно поменять местами. Все потому, что стандартная анимация первого монстра изначально направлена влево, а второго направо.

Платформер на Construct 2. Враги персонажа (скриншот 33)

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

Платформер на Construct 2. Враги персонажа (скриншот 34)

И последний штрих, это уничтожение монстра. Для этого мы подготовили отдельную анимацию.

Создаем новое событие (Add event):

Условие 1: объект player → On collision with another object → в Object выбираем объект monster_2 → Done

Условие 2: объект player → Is falling → Done

В первом условии проверяется, коснулся ли персонаж летающего монстра. Во втором условии проверяется, падает ли (приземляется сверху) персонаж.

 

Добавляем действия (Add actoin):

Действие 1: объект monster_2 → Set animation → в Animation вводим «Fall» (в кавычках), в From выбираем beginning → Done

Действие 2: объект monsters_2 → Set vector X → в Vector X вводим 350 → Done

Действие 3: объект monsters_2 → Set vector Y → в Vector Y вводим -500 → Done

Действие 4: объект monsters_2 → Set collisions enabled → в Collisions выбираем Disabled → Done

Действие 5: объект monsters_2 →  Set gravity → в Gravity вводим 1500 → Done

Разбираемся. В первом действии запускаем анимацию Fall (это, в которой у монстра звездочки кружатся над головой). Во втором действии для монстра создается рывок вперед (по координате X) на 350 пикселей за секунду. В третьем действии для монстра задается рывок вверх (по координате Y) на -500 пикселей за секунду. В четвертом действии у монстра отключается маска столкновений, чтобы он ничего не задевал. А в пятом действии у монстра появляется гравитация (1500 — это значение, как у персонажа), чтобы он смог упасть.

 

Оставляем комментарий: Уничтожение монстра.

Платформер на Construct 2. Враги персонажа (скриншот 35)

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

 

Проверяем результат:

Платформер на Construct 2. Враги персонажа (скриншот 36)

Замечательно. Дополнительно добавьте к летающему монстру поведение Destroy Outside Layout, чтобы монстр уничтожался, вылетев за пределы макета.

Платформер на Construct 2. Враги персонажа (скриншот 37)

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