Я хочу сделать серию расширяющихся паттернов пуль, которые формируют такие формы, как квадраты, треугольники и т. Д. Пример того, что мне нужно, можно увидеть в следующем видео, где, когда звезды собираются, пули взрываются в форме расширяющаяся звезда:
12
Ответы:
Самый простой способ сделать это - сначала спроектировать форму, а затем рассчитать движение частиц. В этом ответе я буду строить квадрат, но это относится к любой форме.
Начните с проектирования вашей фигуры как относительного положения вокруг некоторой исходной точки.
Теперь вам нужно рассчитать, как форма будет расширяться. Чтобы сделать это, мы просто вычисляем вектор, указывающий от на
origin
к каждомуpoint
, вычитаяorigin
положение из нашегоpoint
положения и затем нормализуя вектор.vector = normalize(point.x - origin.x, point.y - origin.y)
,Теперь мы можем рассчитать положение точек в любой момент времени, используя этот вектор. Вы рассчитываете следующую позицию очков, делая
point.position += point.vector * point.velocity
. Пример псевдокода с использованием нашего предыдущего пункта:При этом все точки будут перемещаться наружу на 3 единицы в каждом кадре.
Примечания
источник
Итак, существует проект под названием BulletML, который является языком разметки для создания сложных паттернов частиц / пуль. Вам почти наверняка понадобится перенести код на свой собственный язык, но он может сделать действительно удивительные вещи.
Например, этот босс был сделан в (сильно модифицированном) расширении BulletML для Unity3D (автор этого паттерна загрузил это видео и Misery безумно, а также хорошо 1 ). Это самый сложный вариант этого врага, и он показывает, на что BulletML способен довольно хорошо (и, кроме того, посмотрите на других боссов Мизери, таких как Wallmaster ).
Или я могу показать этот пример, который является шаблоном, который я написал, работая над расширением для The Last Federation , используя более старую версию системы, которая менее дружественна к модам и использует только односимвольные переменные AZ:
Зеленые пули, создающие эти кольца, порождаются родительской пулей, которая вращается с высокой скоростью, но сами не имеют движения. Они наносят огромный урон, удерживая игрока на большем расстоянии, ограничивая его оружием с меньшим уроном и позволяя мобильным защитникам преследовать игрока (игрок выиграл, если неподвижная структура в середине там была разрушена).
Вот часть синтаксиса XML, которая создает эти пузыри:
На снимке экрана вы можете увидеть некоторые фиолетовые кадры "гравитационной волны", которые почти мгновенно перемещаются от источника (который вращается) к краю пузыря, после чего он порождает зеленый выстрел "изогнутой полосы", который находится там в течение 12 секунд до despawning. Синие и желтые снимки я пропустил, так как они намного сложнее.
Один из других паттернов ( артиллерийский снаряд ) в расширении на самом деле был написан Мизери, хотя я внес в него некоторые изменения. Вначале это проникающий выстрел с низким уроном, который летит на дальние дистанции, а затем взрывается в огромный фейерверк, наносящий тонны урона. Его максимальная дальность была намного выше, чем мог достигнуть игрок, по существу заставляя игрока действовать на короткой дистанции, что было выгодно для других типов NPC-юнитов из-за эффекта дробовика (больше пуль сгруппировалось в небольшой зоне).
С BulletML легко работать, и он может делать удивительные вещи. Пули могут изменять направление, изменять скорость, порождать другие шаблоны, рано умирать, повторять сбор команд в цикле, использовать задержки, менять изображение спрайта пули, следовать за своим родителем (или нет) ... И все, что оно не поддерживает, вы могли бы напиши в него.
Я определенно рекомендую это, если вы делаете серьезную игру в жанре «стреляй» Вам все равно придется потренироваться в математической системе координат, чтобы получить желаемые фигуры, о чем Чаранор говорит в своем ответе, но пули, такие как BulletML, дадут вам гораздо больше гибкости, что вы потратите больше времени на разработку новых шаблонов, чем на выяснение как их кодировать
источник
Как указывает Charanor, вы можете использовать массив точек, чтобы определить свою форму, а затем обновить их положение с течением времени. Ниже приведен рабочий пример реализации формы звезды или пользовательской формы с использованием точек:
источник