ACS. Дождь

Тор: Папа, смотри, я сделал дождь!
Один, выжимая плащ: молодец, сынок, супер… просто супер…

Здрасссьте!

Сегодня я сделал скрипт. Этот скрипт создаёт примитивный дождь вокруг игрока. Он основан на функции спавна частиц. Синтаксис у неё конский и основан на спавне по координатам, а не, к примеру, из какого-то актора. Поэтому он пугает новичка и меня. Но сегодня мы заставим его спавнить частицы вокруг именно игрока. Для наглядности сделаем 2 скрипта.

script 1 ENTER {
Thing_ChangeTID(0, 999);
ACS_Execute(2, 0);
}

Поскольку ENTER, скрипт активируется игроком, и любая функция, где TID=0=ActivatorTID (то есть, если вместо ТИДа указан ноль, функция срабатывает на того, кто активировал скрипт), сработает на игрока. Поэтому

Thing_ChangeTID(0, 999);

меняет идентификатор игрока с 0 на 999. Ну а вторая строчка, очевидно, запускает второй скрипт.

script 2 (void) {
SpawnParticle (0xC0C0C0, true, 200, 5, (GetActorX(999)+random(1000.0, -1000.0)), (GetActory(999)+random(1000.0, -1000.0)), 990.0, 5.0, 0.0, -10.0, 0.0, 0.0, 0.0, 255, -1);
Delay(1);
Restart;
}

Как видим, скрипт состоит из одной функции, которая каждый тик перезапускается (дилэй и рестарт, соответственно). Болон уже рассказывал о ней, но давайте разберём в нашем случае.

0xC0C0C0 — сначала пишем обязательно «0x», а потом шестизначный код цвета. Его можно подсмотреть, попробовав изменить цвет тумана или освещения в секторе, либо тут, например.

true — тут мы указываем, что частица имеет полную яркость. Судя по всему, если False, яркость зависит от яркости сектора.

200 — тут я указал время жизни частицы. По ситуации. Это число в тиках, по умолчанию частица живёт 1 секунду (35 тиков) и потом пропадает. Нам надо побольше. Максимум — 255 тиков.

5 — а тут у меня размер частицы. Можно написать рандомное значение (мы уже знаем, как), чтобы капельки или снежинки были разными.

(GetActorX(999)+random(1000.0, -1000.0)), (GetActorY(999)+random(1000.0, -1000.0)), 990.0 — а вот эти три значения — это координаты точки спавна, X/Y/Z. Последнее, 990.0 — это высота. У меня высота потолка равна 1000, я указал такую циферку.

GetActorX и GetActorY (есть также GetActorZ)- эти функции берут координату указанного актора, в нашем случае — игрока (999).

Вообще есть такая штука, как AAPTR_PLAYER1, которую можно указать в SetActivator. То есть SetActivator(AAPTR_PLAYER1); делает игрока 1 активатором скрипта и со всеми вытекающими. Но в моём случае почему-то не работает, приходится присваивать игроку тид. Может, я что-то не так делаю или не так понял, поэтому можете мне объяснить, если знаете. А вот тут, похоже, нам прозрачно намекнули, как узнать что-то, например, о существе, которое в прицеле. Скажите — и я напишу статью с такой штукой. Проверил — осуществимо, но скрипт надо написать с умом, чтоб не засирал консоль.

random(1000.0, -1000.0) — а этот рандом нужен, чтобы частичка спавнилась где-то вокруг нас на расстоянии, не более 1000. Этого достаточно, но вы можете расширить радиус до 3000, однако, чем больше это расстояние, тем менее плотным будет дождь.

ВАЖНО! Значения координат должны быть с точкой, с ней же и должны быть числа, на которые мы их меняем, иначе не сработает.

5.0, 0.0, -10.0 — следующие три значения — это скорость по осям X/Y/Z. Как видите, у меня есть скорость по оси X, равная 5 (И ТОЖЕ С ТОЧКОЙ! Иначе не будет…), это чтобы дождик летел по косой (имитирует ветер), и если вы будете задавать разную горизонтальную скорость (по иксу и игрику), будете имитировать разные направления ветра и его силу. А направление регулирует знак числа (то есть, можно указать число с минусом, и тогда частица по горизонтальной оси полетит в другую сторону). А вот по оси Z, как видите, у меня как раз отрицательное значение -10.0, чтобы частица падала вниз, а не летела вверх. Скорость можно менять, но для меня оптимальное значение — между 10 и 15. Ничто не мешает вставить рандом.

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

Ну и два последних значения, — это, соответственно, прозрачность частицы с самого начала (по дефолту 255=полная непрозрачность) и степень затухания (по дефолту стоит -1, что означает, что частица постепенно затухает на протяжении срока существования, но я поставил 0).

Я скопировал эту строчку 5 раз, чтобы мой дождик был более заметен и плотен. Большее количество почему-то создало длинную задержку. Можно играть с прозрачностью и цветом, чтобы добиться разного эффекта, рандомизировать размер частицы и скорость падения. В Mapinfo прописать lightning в этой карте, наконец… Можете вырубить скрипт при заходе в интерьер (82 Script terminate, например), тогда в помещении не будет осадков.

А потом пошёл в обсуждения, чтобы спросить, можно ли заставить одну строку выполниться одновременно несколько раз, и понял, что я — идиот:

for (int i=10; i>0; i--) //выполнить 10-кратно
{
SpawnParticle (0xFFFFFF, true, 200, random(3, 7), (GetActorX(999)+random(1000.0, -1000.0)), (GetActory(999)+random(1000.0, -1000.0)), 990.0, 5.0, 0.0, random(-10.0, -15.0), 0.0, 0.0, 0.0, 200, 0);
}
Delay(1);
Restart;
}

А для более реалистичного дождя скачать спавнер погоды, всё это гуглится и есть на realm667. Эти спавнеры представляют собой акторы, в которых есть много настроек, но результат куда реалистичнее, чем — просто сыпать частицы вокруг игрока. Вам выбирать.

Вот такая получилась статья. Нароооод,не спииим, с добрым утроооом! RIP AND TEAR!:)

avataravatar

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!