Предисловие
В ACS есть замечательная комманда SpawnParticle, которая позволяет создавать частицу — кружочек произвольного цвета и размера. Деаля много таких частиц на разных координатах, можно буквально рисовать кистью по 3D пространству.
Пример, использования частиц (скрипт от ZZYZX).
Перейдем к делу.
Создаем частицы.
За создание частицы отвечает функция SpawnParticle.
Напишите следующий код у себя в ACS:
script 10 (void)
{
SpawnParticle(0x00FF00, true, 1, 10, 0.0, 0.0, 0.0);
Delay(1);
restart;
}
Синтаксис у SpawnParticle следующий:
SpawnParticle(цвет, fullbright, время_жизни, размер, x, y, z);
- цвет — указывает цвет частицы, в виде числа (рекомендую задавать цвет в HEX формате).
- fullbright — если true, то освещение частицы не зависит от освещения сектора.
- время_жизни — время существования частицы (задается в тиках).
- размер — размер частицы.
- x, y, z — координаты частицы. Обратите внимание, на то что это число — дробное.
Получается в этой строке:
SpawnParticle(0x00FF00, true, 1, 10, 0.0, 0.0, 0.0);
- цвет — 0x00FF00, зеленый.
- fullbright — true, не реагирует на уровень освещенности сектора.
- время_жизни — 1 тик.
- размер — 10.
- x, y, z — 0, 0, 0.
Данный скрипт — бесконечно спавнит частицу, на координатах 0, 0, 0. Кстати эта координата, обозначается желтым плюсом, в Doom Builder.
Запускаем, и смотрим результат.
Одинокая частица выглядит скучно, исправим это.
Рисуем прямую линию.
Перепишите следующий код к себе в ACS:
script 11 (void)
{
int i = 0;
while(i < 100.0)
{
SpawnParticle(0x00FF00, true, 1, 10, 0, 0, 0+i);
i += 1.0;
}
Delay(1);
restart;
}
Цикл while, проходит по координатам z, от 0.0 до 100.0, и спавнит частицы. Таким образом получается прямая линия.
Линию рисовать научились, теперь научимся делать круг.
Рисуем круг.
Для создания круга, нам понадобится sin (синус) и cos (косинус). Их, графики, выглядят следующим образом.
Значение sin и cos, находится в диапазоне от 0.0 до 1.0.
Вы могли заметить, что cos — почти, зеркальное отражение sin, Оно и понятно, если знать, что такое sin и cos. А это, всего-лишь, соотношение сторон прямоугольного треугольника.
- гипотенуза — самая большая сторона треугольника.
- катет — сторона треугольника, образующая прямой угол. (A, B)
- синус — отношение противолежащего катета к гипотенузе. (B / C)
- косинус — отношение прилежащего катета к гипотенузе. (A / C)
Из-за того что, у sin / cos, катет делится на гипотенузу, итоговое значение не может быть больше единицы. И, становится понятно, почему sin и cos противоположности, потому-что, увеличивая катет «A«, уменьшается катет «B«, и соответственно, увеличивается cos, уменьшается sin.
Теперь перейдем к главному, круг рисуется путем объединения функций синуса и косинуса.
Напишите следующий код к себе в ACS:
script 2 (void)
{
int x = 0.0;
int y = 0.0;
int z = 0.0;
int radius = 50.0;
int number_of_particles = 100;
int step = 1.0/number_of_particles;
for (int i = 0; i < number_of_particles; i++)
{
x = sin(step*i) * radius;
y = cos(step*i) * radius;
SpawnParticle(0x00FF00, true, 1, 4, x, y, z);
}
Delay(1);
restart;
}
Разберем ключевые моменты:
int number_of_particles = 100;
Здесь, мы указываем количество точек (частиц) круга.
int step = 1.0/number_of_particles;
- sin(1.0) вернет 0.0
- cos(1.0) вернет 1.0
1.0 это минимум / максимум для sin / cos. В данном случае, мы делим 1.0 на количество частиц. Таким образом, получается распределить частицы — равномерно.
Далее, в цикле рисуется круг.
for (int i = 0; i < number_of_particles; i++)
{
x = sin(step*i) * radius;
y = cos(step*i) * radius;
SpawnParticle(0x00FF00, true, 1, 4, x, y, z);
}
Координатой x, управляет sin, а координатой y, управляет cos.
x = sin(step*i) * radius;
y = cos(step*i) * radius;
Число sin / cos умножаем на радиус круга.
Теперь, запускаем.
Получился красивый круг. Используя круг как основу, можно сделать луч НЛО, поднимающий старых фермеров.
Создаем луч НЛО.
Данный скрипт будет спавнить круг, летящий вниз.
В ACS, пропишите следующее:
script 5 (void)
{
int x = 0.0;
int y = 0.0;
int z = 300.0;
int number_of_particles = 250;
int step = 1.0/number_of_particles;
for(int j=0;j<z;j+=5.0)
{
for (int i = 0; i < number_of_particles; i++)
{
x = sin(step*i) * 50;
y = cos(step*i) * 50;
SpawnParticle(0x00FF00, true, 1, 4, x, y, z-j);
}
Delay(1);
}
}
Разберем код:
int z = 300.0;
Задаем высоту, на которой спавнится круг.
for(int j=0;j<z;j+=5.0)
{
В этом цикле, используется переменная j, которая будет вычитаться из начальной координаты z, в SpawnParticle.
SpawnParticle(0x00FF00, true, 1, 4, x, y, z-j);
Таким образом, увеличивая j, мы уменьшаем z, то-есть, создается эффект перемещения круга вниз (до координаты 0.0).
Далее поместим скрипт 5 в цикл, что-бы он вызывался много-много раз.
script 6 (void)
{
ACS_ExecuteAlways(5,0,0,0,0);
Delay(6);
restart;
}
Теперь, похищающий луч готов, время тестить.