Рейтинг - 5.0 (1)

Сегодня мы научимся запускать Cleo-скрипты с других скриптов. Хотя точнее было бы сказать - запуск других потоков с Cleo-срипта.

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

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

{$CLEO}
0000:

while true
 if AND
 actor.Driving($PLAYER_ACTOR)
 0AB0: key_pressed 74 // J
 then
 // ... \\
 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, затем сесть в другую машину и снова нажать кнопку J. Обе машины будут "заминированы". После этого нужно нажать всего 1 раз кнопку K, как все машины, которые заминированы, будут взорваны! Но не всё так будет в мейне. Это и есть проблема. С запуском всё получится, но если сохраниться с активными двумя и больше потоками приведёт к вылету игры при загрузке, так как в мейне можно сохранять только 1 активный поток с тем же именем.

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

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

Теги: запуск другого потока, поток, CLEO, thread, custom thread

Yurko_UA   (17.09.12 23:33)
Давно хотів спитати як це робиться!

HYPERMUV   (18.09.12 15:03)
интересный урок, спасибо

Vital   (30.07.13 17:48)
Действительно ли никак нельзя возвращать параметры? Может, разве что cleo-переменными, хоть это и не лучшая идея.

wmysterio   (30.07.13 18:57)
Думаю ответ уже решён. Осталось добавить новый урок по возврату параметров smile

Yurko_UA   (28.02.14 19:31)
"Думаю ответ уже решён.
Осталось добавить новый урок
по возврату параметров" напишеш колись?

wmysterio   (01.03.14 16:26)
Вот пример возврата(это только образно можно назвать возвратом) - урок.
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Какая GTA Вам понравилась больше всего?
Всего ответов: 9
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
Рекомендую
Реклама