Самодельный таймер — различия между версиями
Материал из GTAModding.ru
Vital (обсуждение | вклад) (Новая: ==Введение== Итак, многие, кто начал изучать скриптинг, знают, что в cleo скриптах нельзя использовать гло...) |
Vital (обсуждение | вклад) (→Код таймера) |
||
(не показаны 2 промежуточные версии 1 участника) | |||
Строка 8: | Строка 8: | ||
not actor.Dead($PLAYER_ACTOR) | not actor.Dead($PLAYER_ACTOR) | ||
not actor.Driving($PLAYER_ACTOR) | not actor.Driving($PLAYER_ACTOR) | ||
− | 0AB0: key_pressed 0xD //проверки на то, что игрок жив, не в авто, и на нажатие клавиши "Enter" | + | 0AB0: key_pressed 0xD |
+ | //проверки на то, что игрок жив, не в авто, и на нажатие клавиши "Enter" | ||
jf @Cicl | jf @Cicl | ||
− | actor.StorePos($PLAYER_ACTOR,2@,3@,4@) //сохраняем текущие координаты игрока в переменные | + | actor.StorePos($PLAYER_ACTOR,2@,3@,4@) |
− | 02CE: 4@ = ground_z_at 2@ 3@ 4@ //получаем координату поверхности, чтобы действие не происходило в воздухе | + | //сохраняем текущие координаты игрока в переменные |
− | //начало самого таймера, то есть простого цикла, известного многим по школьному курсу программирования (в Turbo Pascal) | + | 02CE: 4@ = ground_z_at 2@ 3@ 4@ |
− | for 1@ = 15 downto 0 //берем downto, чтобы счет шел от большего к меньшему | + | //получаем координату поверхности, чтобы действие не происходило в воздухе |
− | 01E5: show_text_1number_highpriority GXT 'VAR' number 1@ time 1000 flag 1 //выводим значение переменной (секунды), которая в цикле изменяется с 15 до 0 | + | //начало самого таймера, то есть простого цикла, известного многим по |
− | if //начало условия. эта часть необязательна, она нужна для звука, который будет проигрываться, когда время будет меньше 5 секунд | + | //школьному курсу программирования (в Turbo Pascal) |
− | 1@ <= 5 //если значение времени таймера меньше или равно 5, то... | + | for 1@ = 15 downto 0 |
+ | //берем downto, чтобы счет шел от большего к меньшему | ||
+ | 01E5: show_text_1number_highpriority GXT 'VAR' number 1@ time 1000 flag 1 | ||
+ | //выводим значение переменной (секунды), которая в цикле | ||
+ | //изменяется с 15 до 0 | ||
+ | if | ||
+ | //начало условия. эта часть необязательна, она нужна для | ||
+ | //звука, который будет проигрываться, когда время будет меньше 5 секунд | ||
+ | 1@ <= 5 | ||
+ | //если значение времени таймера меньше или равно 5, то... | ||
then | then | ||
− | 018C: play_sound 1084 at 0.0 0.0 0.0 //...проигрываем звук №1084 | + | 018C: play_sound 1084 at 0.0 0.0 0.0 |
− | end //конец условия. else не нужно в данном случае | + | //...проигрываем звук №1084 |
− | wait 1000 //ждем 1 секунду, иначе таймер закончится сразу же, да и таймер в секундах | + | end |
− | end //конец цикла, это и конец таймера | + | //конец условия. else не нужно в данном случае |
− | 020C: create_explosion_with_radius 10 at 2@ 3@ 4@ | + | wait 1000 |
+ | //ждем 1 секунду, иначе таймер закончится сразу же, да и таймер в секундах | ||
+ | end | ||
+ | //конец цикла, это и конец таймера | ||
+ | 020C: create_explosion_with_radius 10 at 2@ 3@ 4@ | ||
020C: create_explosion_with_radius 6 at 2@ 3@ 4@ | 020C: create_explosion_with_radius 6 at 2@ 3@ 4@ | ||
− | wait 750 //ждем 750 мс, чтобы игрок не сразу мог перезапустить скрипт | + | //создаем два больших взрыва |
− | jump @Cicl //идем на начало</source> | + | wait 750 |
+ | //ждем 750 мс, чтобы игрок не сразу мог перезапустить скрипт | ||
+ | jump @Cicl | ||
+ | //идем на начало</source> | ||
− | Суть скрипта в том, что спустя 15 секунд после нажатия Enter произойдет взрыв (в той точке, в которой игрок нажал клавишу). | + | Суть скрипта в том, что спустя 15 секунд после нажатия Enter произойдет взрыв (в той точке, в которой игрок нажал клавишу). |
==Преимущества== | ==Преимущества== |
Текущая версия на 14:40, 16 мая 2012
Введение
Итак, многие, кто начал изучать скриптинг, знают, что в cleo скриптах нельзя использовать глобальные переменные (точнее не рекомендуется, это не относится к общим, таким, как $PLAYER_ACTOR, $ONMISSION и т.п.). Но если попробовать использовать локальные переменные (1@, например) для создания таймера, игра вылетит, ведь этому опкоду нужна именно глобальная переменная. Поэтому приходится либо отказываться от таймера вовсе, либо рисковать и использовать глобальные переменные. Я (конечно, думаю, что я не первый) придумал новый способ создания таймера, простой и имеющий "гибкие" настройки. Ему не нужны глобальные переменные, он, так же, как и стандартный его собрат, выводится на экран, так же есть звуки, когда значения таймера малы, но все в нем можно изменить по собственному желанию. Итак, сначала приведу сам код, затем объясню все по порядку.
Код таймера
:Cicl wait 0 if and not actor.Dead($PLAYER_ACTOR) not actor.Driving($PLAYER_ACTOR) 0AB0: key_pressed 0xD //проверки на то, что игрок жив, не в авто, и на нажатие клавиши "Enter" jf @Cicl actor.StorePos($PLAYER_ACTOR,2@,3@,4@) //сохраняем текущие координаты игрока в переменные 02CE: 4@ = ground_z_at 2@ 3@ 4@ //получаем координату поверхности, чтобы действие не происходило в воздухе //начало самого таймера, то есть простого цикла, известного многим по //школьному курсу программирования (в Turbo Pascal) for 1@ = 15 downto 0 //берем downto, чтобы счет шел от большего к меньшему 01E5: show_text_1number_highpriority GXT 'VAR' number 1@ time 1000 flag 1 //выводим значение переменной (секунды), которая в цикле //изменяется с 15 до 0 if //начало условия. эта часть необязательна, она нужна для //звука, который будет проигрываться, когда время будет меньше 5 секунд 1@ <= 5 //если значение времени таймера меньше или равно 5, то... then 018C: play_sound 1084 at 0.0 0.0 0.0 //...проигрываем звук №1084 end //конец условия. else не нужно в данном случае wait 1000 //ждем 1 секунду, иначе таймер закончится сразу же, да и таймер в секундах end //конец цикла, это и конец таймера 020C: create_explosion_with_radius 10 at 2@ 3@ 4@ 020C: create_explosion_with_radius 6 at 2@ 3@ 4@ //создаем два больших взрыва wait 750 //ждем 750 мс, чтобы игрок не сразу мог перезапустить скрипт jump @Cicl //идем на начало
Суть скрипта в том, что спустя 15 секунд после нажатия Enter произойдет взрыв (в той точке, в которой игрок нажал клавишу).
Преимущества
Как видите, сам код прост и мал по размеру. К тому же есть еще плюсы:
-Не нужно проверять, что время таймера равно нулю, цикл сам завершается
-Можно легко и быстро настроить абсолютно все: время, звук таймера, и при каких значениях он будет воспроизведен, текст.
Помимо того, что можно выводить разные варианты текста (как по стилям написания, так и по цвету, например, сделать текст красным, когда значение таймера меньше 5 секунд), Вы сможете вывести текст как текст-бокс (серый прямоугольник в верхнем левом углу экрана, примером будет сообщение о том, как сменить оружие на другое). Для этого понадобится команда 0513, только не забудьте применить команду 03E6 после цикла, чтобы текст-бокс не держался на экране все время и исчез (сам он не исчезает).
Единственная проблема состоит в том, что выводятся именно секунды,а не минуты, но это, конечно, можно исправить, немного поломав голову.
В целом можно сказать, что такой таймер гораздо проще создается, его можно изменить по своему желанию, так что, если Вам понравился этот способ, дерзайте, у Вас все получится, если подключить фантазию. Можно сделать разноцветный текст, "музыкальный" таймер (звук на каждой секунде) и т.д. ...