00083. Запуск другого потока с Cleo-скрипта

Запуск другого потока с Cleo-скрипта|Сегодня мы научимся запускать Cleo-скрипты с других скриптов. Хотя точнее было бы сказать - запуск других потоков с Cleo-срипта.|wmysterio|wmysterio||||Всем привет! Начнём очередной урок по скриптингу. Наверное, Вы видели в файловом архиве мой скрипт "Универсальная стрелка", суть которого было облегчить жизнь скриптерам с удалением маркеров. Сегодня мы напишем похожий скрипт.

Начнём с того, что нам потребуется написать скрипт-запуск. Для примера, мы напишем скрипт "Бомба". Когда СЖ садится в машину и нажимает клавишу J, то автомобиль будет заминирован. Когда игрок нажмёт клавишу <kbd>K - произойдёт взрыв! Начнём с простенького - проверим находится ли игрок в машине и т.п.

{$CLEO}
0000:

while true
 if AND
 actor.Driving($PLAYER_ACTOR)
 0AB0: key_pressed 74 // J
 then
 // ... &#92;&#92;
 wait 2500
 end 
wait 0
end

Скрипт готов на 99%! Нам осталось написать только сам скрипт бомбы. Это значит нам нужно написать ещё один Cleo-скрипт, который будет имитировать взрыв, поэтому напишем его:

{$CLEO .s}
0000:

:BOMB
thread 'BOMB'
wait 0
1@ = 0

while car.Defined(0@)
 if
 0AB0: key_pressed 75 // K
 then
 1@ = 1
 break
 end 
wait 0
end

if
1@ == 1
then
car.StorePos(0@, 2@, 3@, 4@)
0565: create_soundless_explosion_at 2@ 3@ 4@ type 0 
0948: create_explosion_at 2@ 3@ 4@ type 0 camera_shake 1.0 
end

0A93: end_custom_thread

Обратите внимание на выражение:

{$CLEO .s}

В этом случае санник скомпилирует скрипт с расширением "*.s" и загружатся скрипт вместе с игрой не будет. Назовём его "BOMB", что бы файл соответствовал названию файла ( для удобства ).

Суть скрипта проста: когда нажимаем кнопку K` - переменной "1@" задаётся значение 1 и будет осуществлён выход с цикла командой "break". После этого обязательно ставим проверку на то, что переменная действительно равна единице, что бы выполнить блок со взрывом. Если это условие не выполняется, значит машина не существует и переменная "1@" никак не сможет изменить своё первоначальное значение.

От сюда и главный вопрос: как скрипт будет знать, что эта машина существует, если в скрипте нигде не создавалась она? Ответ кроется в запуске нашего скрипта бомбы. Чтобы запустить его, нужно воспользоваться опкодом.

0A92: create_custom_thread "BOMB.s"

Здесь: BOMB.s" - имя файла, что мы скомпилировали. Этот файл обязательно должен находится в папке "CLEO", иначе игра вылетит при попытке запуска

Так как же наш скрипт бомбы узнает о машине? Всё очень просто! К опкоду "0A92" нужно добавить параметр с переменной нашей машины. Для этого мы должны в скрипте-стартере получить машину игрока и передать эту переменную в опкод "0A92":

{$CLEO}
0000:
 
while true
 if AND
 actor.Driving($PLAYER_ACTOR)
 0AB0: key_pressed 74 // J
 then
 03C0: $CAR = actor $PLAYER_ACTOR car // получили хэндл тачки
 0A92: create_custom_thread "BOMB.s" $CAR // передаём её в другой поток
 0ACE: show_formatted_text_box "BOMB DETECTED!"
 wait 2500
 end 
wait 0
end

Из этого можно сделать вывод, что запуск нового потока осуществляется за принципом с scm-функциями. Передать можно до 34 параметров. Впрочем, эта возможность доступна и обычному "create_thread" из "main.scm", но есть главная проблема...

Самое интересное то, что вызывать один и тот же поток можно очень много раз. В нашем скрипте-стартере доступна такая возможность. Мы можем сесть в машину и нажать кнопку J, затем сесть в другую машину и снова нажать кнопку <kbd>J. Обе машины будут "заминированы". После этого нужно нажать всего 1 раз кнопку K`, как все машины, которые заминированы, будут взорваны! Но не всё так будет в мейне. Это и есть проблема. С запуском всё получится, но если сохраниться с активными двумя и больше потоками приведёт к вылету игры при загрузке, так как в мейне можно сохранять только 1 активный поток с тем же именем.

Вот вам небольшое задание: написать скрипт-стартер, который будет узнавать текущую машину игрока и написать скрипт, который будет осуществлять перекраску автомобиля. В качестве параметров должно быть машина и два параметра цвета, в который машина будет окрашена. Тоесть, нужно будет реализовать такой код запуска:

0A92: create_custom_thread "CARCOLOR.s" $CAR $CAR_CLOR1 $CAR_COLOR_2

|2059|1|0||zapusk_drugogo_potoka_s_cleo_skripta|1499844974

Last updated