Вступление
В этой статье разберём механику выстрела по дуге в Construct 3. Это тот случай, когда с виду всё выглядит просто: есть пушка, есть снаряд, есть цель. Но чтобы игроку было приятно пользоваться такой механикой, нужно добавить несколько важных деталей: плавное наведение, заряд силы выстрела, предпросмотр траектории и небольшой эффект при попадании. Мы не будем делать сложную физическую систему или полноценную артиллерийскую игру. Наша задача — собрать понятную основу, которую потом можно развивать под свой проект: добавить урон башне, разные типы снарядов, ограничение угла поворота пушки, интерфейс силы выстрела или несколько уровней.
Главный акцент здесь — именно на траектории выстрела. Игрок ещё до запуска снаряда должен примерно понимать, куда он полетит. Для этого мы сделаем линию из маленьких точек, которые заранее показывают будущую дугу полёта. Такой подход хорошо подходит для артиллерийских механик, головоломок, мини-игр с физикой и любых ситуаций, где важно показать направление и силу выстрела. В итоге у нас получится простая, но уже достаточно “игровая” механика: пушка следует за курсором, сила выстрела накапливается при удержании кнопки мыши, траектория обновляется в реальном времени, а после попадания появляется короткая анимация дыма.
Какие объекты нужны в проекте
Перед тем как писать события, подготовим несколько объектов на сцене. Названия лучше сразу сделать понятными, потому что дальше мы будем использовать их в формулах и событиях Construct 3.
gun— вращающаяся часть пушки, то есть сам ствол. Именно он будет поворачиваться в сторону курсора мыши. Важно настроить у негоImagePoint 1на конце дула, потому что из этой точки будет вылетать снаряд.
gunwood— основание пушки. Оно просто стоит на месте и не участвует в логике выстрела. Вращать мы будем толькоgun.bomb— снаряд, который появляется в момент выстрела и летит по дуге. Для него нужно добавить поведениеBullet, а через события мы будем задавать угол движения, скорость и гравитацию.
Trajectory— маленькая точка для предпросмотра траектории. В примере это простой белый спрайт примерно8×8. Таких точек будет несколько: мы создадим их один раз при старте сцены, а потом будем только менять их позицию.ground— земля или платформа. Еслиbombкасается земли, снаряд исчезает, а на его месте появляется дым.towerenemy— цель, по которой мы стреляем. В примере это башня противника. При попадании в неё логика такая же: создаём дым и удаляем снаряд.
smoke— короткая анимация дыма после попадания. Она появляется на месте бомбы, проигрывает анимацию и затем автоматически удаляется.
Mouse— объект для управления. Через него пушка будет смотреть в сторону курсора, заряжать силу при удержании левой кнопки и стрелять при отпускании.
Поворот пушки за курсором
Начнём с самого базового — пушка должна смотреть туда, куда игрок ведёт курсор. В Construct 3 для этого удобно использовать объект Mouse и каждый кадр менять угол объекта gun.
Но если просто поставить угол пушки напрямую на курсор, движение получится слишком резким. Поэтому лучше использовать anglelerp() — она плавно поворачивает объект от текущего угла к нужному.
Событие выглядит так:
Что здесь происходит:
angle(gun.X, gun.Y, Mouse.X, Mouse.Y)считает угол от пушки до курсора;anglelerp()плавно приближает текущий угол пушки к этому направлению;10 * dtотвечает за скорость поворота и делает движение стабильнее при разном FPS.
В итоге gun не дёргается мгновенно за мышкой, а немного “догоняет” курсор. Это маленькая деталь, но она сильно улучшает ощущение управления.
Заряд силы выстрела
Теперь добавим механику заряда. Идея простая: пока игрок удерживает левую кнопку мыши, сила выстрела постепенно растёт. Когда кнопку отпускает — бомба вылетает с накопленной скоростью.
Для этого внутри группы Cannon удобно использовать несколько локальных переменных:
ShotMinSpeed— минимальная скорость выстрела;ShotMaxSpeed— максимальная скорость после полного заряда;ShotSpeed— текущая сила выстрела;ShotChargeRate— скорость накопления заряда;ShotGravity— гравитация снаряда;TrajectoryStep— шаг между точками траектории;TrajectoryDots— количество точек траектории.
Заряд силы делается отдельным событием:

Здесь ShotSpeed постепенно увеличивается каждый кадр, пока кнопка мыши зажата. А функция min() не даёт значению стать больше, чем ShotMaxSpeed.
Например, если ShotMinSpeed = 400, ShotMaxSpeed = 950, а ShotChargeRate = 500, то выстрел будет начинаться с небольшой силы и примерно за секунду доходить почти до максимума.
После самого выстрела важно сбросить силу обратно:

Иначе следующий выстрел сразу начнётся с максимальной мощности, а нам нужно, чтобы игрок каждый раз сам заряжал силу удержанием кнопки.
Важный момент: ShotSpeed влияет не только на полёт бомбы, но и на предпросмотр траектории. Поэтому пока игрок удерживает кнопку, точки траектории будут постепенно вытягиваться дальше. Это делает механику понятной: игрок сразу видит, что сила выстрела растёт.
Предпросмотр траектории точками
Теперь переходим к главной части механики — предпросмотру траектории. Нам нужно, чтобы игрок ещё до выстрела видел примерный путь снаряда. Для этого мы используем объект Trajectory: это маленькая точка, которая показывает одну позицию будущего полёта.
Вместо того чтобы каждый кадр создавать новые точки, мы делаем проще и оптимальнее: при старте сцены создаём нужное количество объектов Trajectory, а дальше только меняем их координаты.
Сначала при запуске layout удаляем старые точки и создаём новые:
Зачем мы сначала удаляем Trajectory? Это удобно на случай перезапуска сцены или тестов в редакторе, чтобы на layout не накопились лишние точки.
После этого каждый кадр мы пересчитываем позицию всех точек:
Здесь важный момент — мы используем Trajectory.IID. Это уникальный порядковый номер каждой точки. Первая точка получает маленькое значение времени, следующая — больше, потом ещё больше. Поэтому точки выстраиваются не в одну позицию, а постепенно уходят вперёд по траектории.
Чтобы линия выглядела приятнее, можно ещё менять прозрачность точек:
Ближние точки будут ярче, а дальние — чуть прозрачнее. Это делает траекторию визуально мягче и понятнее.
Самое приятное здесь то, что ShotSpeed влияет сразу и на будущий выстрел, и на точки предпросмотра. Пока игрок удерживает кнопку мыши и сила растёт, траектория в реальном времени вытягивается дальше. Игрок сразу видит: если отпустить сейчас — снаряд полетит примерно сюда.
Как считается дуга полёта
Чтобы траектория выглядела как настоящий выстрел по дуге, мы используем простую формулу движения снаряда. Не нужно воспринимать это как сложную математику — в Construct 3 она просто помогает нам заранее расставить точки там, где примерно пролетит бомба. Для каждой точки мы считаем условное время:
t = (Trajectory.IID + 1) * TrajectoryStep
То есть первая точка показывает позицию снаряда почти сразу после выстрела, вторая — чуть позже, третья — ещё позже и так далее.
Координата X отвечает за движение вперёд по направлению пушки:
X = gun.ImagePointX(1) + cos(gun.Angle) * ShotSpeed * t
Координата Y похожа, но к ней добавляется гравитация:
Y = gun.ImagePointY(1) + sin(gun.Angle) * ShotSpeed * t + 0.5 * ShotGravity * t ^ 2
Если сказать совсем просто:
gun.ImagePointX(1)иgun.ImagePointY(1)— точка старта, то есть дуло пушки;gun.Angle— направление, куда смотрит пушка;ShotSpeed— сила выстрела;TrajectoryStep— расстояние по времени между точками;ShotGravity— насколько быстро снаряд будет падать вниз. Первая часть формулы толкает точку вперёд по направлению пушки, а гравитация постепенно опускает её вниз. Поэтому предпросмотр получается не прямой линией, а красивой дугой. Именно этот приём делает механику траектории выстрела в Construct 3 понятной для игрока: он не просто стреляет “на глаз”, а заранее видит, как примерно поведёт себя снаряд.
А если говорить "трудным языком", то держите:

Сам выстрел
Когда игрок отпускает левую кнопку мыши, мы создаём bomb в точке вылета пушки и задаём ей параметры полёта. Для этого используем ImagePoint 1, который заранее поставили на конец дула.

Здесь всё достаточно просто: бомба появляется из дула, получает направление пушки, текущую накопленную скорость и гравитацию. После этого мы сразу сбрасываем ShotSpeed, чтобы следующий выстрел снова начинался с минимальной силы.
Попадание и дым
Чтобы выстрел ощущался завершённым, добавим реакцию на столкновение. Если bomb касается земли или башни, мы создаём на её месте объект smoke, а саму бомбу удаляем.

Дальше нужно удалить дым после окончания анимации:

Так сцена не будет засоряться лишними объектами, а попадание будет выглядеть понятнее для игрока. Даже простой эффект дыма уже делает механику приятнее и визуально завершает выстрел.
Что можно улучшить дальше
Эта механика уже работает как основа, но её легко развивать дальше под свою игру:
- добавить шкалу силы выстрела, чтобы игрок видел заряд не только по траектории;
- ограничить угол поворота пушки, если нужно сделать более реалистичное управление;
- добавить урон башне и разрушение после нескольких попаданий;
- сделать разные типы снарядов: обычный, тяжёлый, быстрый или взрывной;
- добавить звук выстрела, полёта и попадания;
- ограничить количество снарядов на уровень;
- адаптировать управление под мобильные устройства.
Лучше не добавлять всё сразу. Сначала стоит довести базовую механику до приятного ощущения, а уже потом постепенно усиливать её новыми деталями.
Заключение
В итоге у нас получилась простая, но полезная механика траектории выстрела в Construct 3. Пушка плавно поворачивается за курсором, сила выстрела заряжается при удержании кнопки, точки заранее показывают будущую дугу полёта, а при попадании появляется небольшой эффект дыма.
Самое важное здесь — не просто запустить снаряд, а сделать механику понятной для игрока. Когда он видит траекторию до выстрела, управление становится честнее и приятнее. Такой подход можно использовать как основу для артиллерийской игры, физической головоломки, мини-игры с разрушением или отдельного игрового прототипа.
Скачать исходник вы можете бесплатно здесь