Механика Knife Hit в Construct 3

Вступление

Ребят в этой статье разберём, как сделать механику в стиле Knife Hit в Construct 3. Идея вообще простая: игрок нажимает на экран, нож резко летит вверх и должен попасть в бревно. Если нож попал — он застревает и начинает вращаться вместе с ним. Если попал в другой нож — игрок проигрывает.

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

В этом уроке мы сделаем базовую механику:

  • бревно будет постоянно вращаться;
  • нож будет резко лететь вверх после клика;
  • при попадании в бревно нож будет прикрепляться к нему;
  • после успешного попадания будет появляться новый нож;
  • при попадании в другой нож будет проигрыш;
  • добавим счёт за успешные попадания;
  • добавим яблоко как бонусный объект.

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

Сцена с бревном, ножом и яблоком

Что подготовить на сцене

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

Нам понадобятся:

  • log — круглое бревно, в которое будет попадать нож;
  • knife — основной нож, который игрок бросает;
  • apple — бонусное яблоко;
  • appleicon — иконка яблока для интерфейса;
  • ScoreText — текст для счёта попаданий;
  • ApplesText — текст для количества собранных яблок;
  • background — фон;
  • Mouse — объект мыши для клика.

Для log нужно добавить поведение Rotate. Благодаря этому бревно будет крутиться само, и нам не придётся каждый кадр вручную менять угол.

Настройки для Rotate:

Speed: 180
Acceleration: 0

Если хочется, чтобы бревно крутилось быстрее, можно поставить 220 или 250. Если нужно спокойнее — 120 или 150.

Для объекта knife добавим поведения:

Bullet
Pin
Physics

Bullet нужен для быстрого полёта ножа вверх. Pin нужен, чтобы нож прикреплялся к бревну после попадания. Physics нужен для проигрыша, когда нож попадает в другой нож и падает вниз.

У поведения Bullet можно оставить такие настройки:

Speed: 0
Acceleration: 0
Gravity: 0
Set angle: No

Важно, чтобы Set angle был выключен. Иначе нож может начать поворачиваться по направлению движения, а нам это не нужно.

У поведения Physics лучше поставить:

Immovable: No
Prevent rotation: No
Density: 1
Friction: 0.5
Elasticity: 0.2
Enabled: No

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

Теперь добавим переменные для knife.

У объекта knife создаём boolean instance variables:

isFlying = false
isStuck = false
isFalling = false

Они нужны, чтобы понимать состояние ножа:

  • isFlying — нож сейчас летит вверх;
  • isStuck — нож уже воткнут в бревно;
  • isFalling — нож падает после проигрыша.

Также создадим две глобальные переменные:

Score будет отвечать за количество успешных попаданий в бревно. Apple будет отвечать за количество собранных яблок.

Бросок ножа

Теперь сделаем первый важный момент — бросок ножа вверх.

Логика простая: когда игрок нажимает левую кнопку мыши, мы проверяем, что нож сейчас не летит, не воткнут и не падает. Если всё нормально — запускаем его вверх через поведение Bullet.

Событие выглядит так:

В Construct 3 угол -90 означает движение вверх.

0 = вправо
90 = вниз
180 = влево
-90 = вверх

Скорость 3500 даёт ощущение резкого броска. Если нож летит слишком быстро, можно уменьшить значение до 2500 или 3000. Если хочется ещё более резкий бросок — можно поставить 4000.

Главное здесь — не делать движение ножа через обычное изменение Y, если хочется получить ощущение броска. Через Bullet нож летит намного приятнее и проще контролируется.

Попадание в бревно

Теперь сделаем успешное попадание.

Когда нож касается log, нам нужно:

  1. остановить нож;
  2. выключить состояние полёта;
  3. отметить, что нож воткнут;
  4. прикрепить нож к бревну;
  5. создать новый нож снизу;
  6. добавить очко к счёту.

Событие:

Здесь важный момент — после попадания нож не просто останавливается. Мы используем Pin, чтобы нож начал вращаться вместе с бревном.

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

После попадания мы создаём новый knife снизу:

System → Create object knife on layer "Layer 0" at (log.X, 1600)

log.X нужен, чтобы новый нож появлялся ровно по центру под бревном. 1600 — это позиция по Y. В твоём проекте она подходит под текущий размер layout. Если нож появляется слишком низко или слишком высоко, можно просто изменить это значение.

Например:

Y = 1500

или

Y = 1650

Ещё мы используем:

knife → Move behind log

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

Столкновение с ножом

Теперь добавим проигрыш.

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

Событие столкновения с другим ножом лучше поставить выше события попадания в бревно. Это важно, потому что если события стоят в неправильном порядкее, Construct может сначала обработать попадание в log, и нож воткнётся, хотя должен был проиграть.

Событие:

Что здесь происходит:

  • Bullet speed to 0 останавливает полёт;
  • isFlying = False говорит, что нож больше не летит;
  • isFalling = True переводит нож в состояние падения;
  • Pin → Unpin на всякий случай отвязывает нож от объектов;
  • Physics enabled включает физику;
  • Set angular velocity заставляет нож крутиться;
  • Apply impulse толкает нож вниз;
  • через 3 секунды layout перезапускается.

Угол 90 означает движение вниз. Значение impulse можно подбирать под свой масштаб.

Если нож падает слишком слабо:

Impulse: 120

Если слишком резко:

Impulse: 40

В нашем случае значение 80 выглядит нормально для текущего размера сцены.

Здесь есть один нюанс. Так как мы используем один и тот же объект knife и для активного ножа, и для воткнутых ножей, Construct может иногда выбирать не тот экземпляр. В простом прототипе эта схема работает нормально, особенно если новый нож всегда является последним созданным объектом.

Если в будущем механика станет сложнее, можно будет разделить объекты на knife и stuckknife. Но для учебной версии это необязательно. Нам сейчас важнее показать сам принцип механики.

Счёт и яблоко

Теперь добавим счёт.

У нас уже есть глобальная переменная:

Score = 0

Когда нож успешно попадает в бревно, мы добавляем:

System → Add 1 to Score

А чтобы текст обновлялся на экране, добавляем событие:

Теперь после каждого попадания число на экране будет увеличиваться.

Теперь добавим яблоко.

В Knife Hit яблоко обычно работает как бонус. Оно находится на бревне, крутится вместе с ним, а если нож попадает в яблоко — яблоко исчезает, и игрок получает дополнительный бонус.

Для объекта apple добавляем поведение:

Pin

На старте layout прикрепляем яблоко к бревну: Теперь яблоко будет вращаться вместе с бревном.

Дальше добавляем событие попадания ножа в яблоко:

Важно: в этом событии мы не останавливаем нож. Яблоко — это не препятствие, а бонус. Нож должен разрезать яблоко и продолжить движение дальше, чтобы попасть в бревно.

В итоге логика получается такая:

knife попал в log = +1 Score
knife попал в apple = +1 Apple
knife попал в knife = проигрыш

Это простая, но уже понятная игровая схема. У игрока есть основная цель — попадать в бревно, и дополнительная цель — собирать яблоки.

Что можно улучшить дальше

Сейчас у нас получилась базовая механика Knife Hit в Construct 3. Она уже работает: нож летит вверх, втыкается в бревно, создаётся новый нож, есть проигрыш при столкновении и бонусное яблоко.

Но эту основу можно развивать дальше.

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

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

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

Ещё можно добавить:

  • звук броска ножа;
  • звук попадания в бревно;
  • звук проигрыша;
  • частицы при попадании;
  • тряску камеры;
  • разные скины ножей;
  • босс-брёвна;
  • сохранение рекорда;
  • меню рестарта.

Главное — не добавлять всё сразу. Лучше сначала сделать простую механику, проверить, что она ощущается приятно, а потом постепенно улучшать её маленькими деталями. Всем спасибо за просмотр, еще увидимся :)