GTA Builder Форум
GTA Vice City => Скриптинг => Тема начата: Prographer от Июнь 26, 2016, 12:05:20 am
-
Всем привет. Сейчас работаю над скриптом рисования изображений радиостанций, и тут возник вопрос по поводу того, как заставить выполняться цикл "while" определённое время. Есть небольшой, повторяющийся участок кода, который рисует заданный спрайт:
while 2@ == 1 // цикл выполняется до того, пока игрок не переключит радиостанцию
wait 0
if Actor.Driving($PLAYER_ACTOR)
jf @draw // перемещает на метку определения номера радиостанции
05E0: 2@ = read_memory 1@ size 1 virtual_protect 0 // 1@ = номер радиостанции (0x7E49C0 + 0x23C)
038D: draw_texture 2 position 3@ 75.0 scale 128.0 128.0 RGBA 255 255 255 255
end
Другими словами, спрайт должен рисоваться только определённое время, после завершения цикла рисования должен ждать смены радиостанции или выхода игрока из автомобиля.
P.S. Кому интересно, прикладываю весь скрипт.
-
Хз насчет цикла while(как и всего "высокоуровневого" скриптинга), но если нужно, чтобы что-то выполнялось/не выполнялось определенное время - можно поставить таймер. В Вайсе 2 таймера - локальные переменные 16@ и 17@.
Т.е., если я правильно понял, твой код я бы написал так:
16@ = 0 // запускаем таймер
:OLOLO
wait 0
if
2@ == 1
jf @Station_Changed
if
Actor.Driving($PLAYER_ACTOR)
jf @draw // перемещает на метку определения номера радиостанции
05E0: 2@ = read_memory 1@ size 1 virtual_protect 0 // 1@ = номер радиостанции (0x7E49C0 + 0x23C)
if
001B: 2000 > 16@ // если не прошло 2 секунды
jf @OLOLO
038D: draw_texture 2 position 3@ 75.0 scale 128.0 128.0 RGBA 255 255 255 255
jump @OLOLO
:Station_Changed
-
Можно еще использовать игровой таймер 0x974B2C
-
Помимо двух таймеров, которые есть у каждого скрипта потока, можно пользоваться универсальным средством, который подходит когда эти таймеры заканчиваются.
01BD: 0@ = current_time_in_ms // используем вот этот опкод
...
//потом в цикле
01BD: 1@ = current_time_in_ms //и сравниваем его со старым значением 0@
0062: 1@ -= 0@ // (int)
if
1@ >= 4200 // вот тут можно поставить свое время в миллисекундах 1 секунда = 1000
then
break // это значит что после 4 с лишним секунд делаем выход
end
-
Помимо двух таймеров, которые есть у каждого скрипта потока, можно пользоваться универсальным средством, который подходит когда эти таймеры заканчиваются.
01BD: 0@ = current_time_in_ms // используем вот этот опкод
...
//потом в цикле
01BD: 1@ = current_time_in_ms //и сравниваем его со старым значением 0@
0062: 1@ -= 0@ // (int)
if
1@ >= 4200 // вот тут можно поставить свое время в миллисекундах 1 секунда = 1000
then
break // это значит что после 4 с лишним секунд делаем выход
end
О! Интересный вариант. Спасибо, попробую :)