Самодельный таймер — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
(Новая: ==Введение== Итак, многие, кто начал изучать скриптинг, знают, что в cleo скриптах нельзя использовать гло...)
 
м
Строка 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>  
  
  

Версия 14:22, 18 марта 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 после цикла, чтобы текст-бокс не держался на экране все время и исчез (сам он не исчезает).

Единственная проблема состоит в том, что выводятся именно секунды,а не минуты, но это, конечно, можно исправить, немного поломав голову.

В целом можно сказать, что такой таймер гораздо проще создается, его можно изменить по своему желанию, так что, если Вам понравился этот способ, дерзайте, у Вас все получится, если подключить фантазию. Можно сделать разноцветный текст, "музыкальный" таймер (звук на каждой секунде) и т.д. ...