GTA Builder Форум

GTA Vice City => Скриптинг => Тема начата: Prographer от Июнь 26, 2016, 12:05:20 am

Название: Время выполнения цикла
Отправлено: 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. Кому интересно, прикладываю весь скрипт.
Название: Re: Время выполнения цикла
Отправлено: Shagg_E от Июнь 26, 2016, 07:41:38 am
Хз насчет цикла 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
Название: Re: Время выполнения цикла
Отправлено: xanser от Июнь 26, 2016, 09:29:57 am
Можно еще использовать игровой таймер 0x974B2C
Название: Re: Время выполнения цикла
Отправлено: mfisto от Июнь 27, 2016, 03:27:37 am
Помимо двух таймеров, которые есть у каждого скрипта потока, можно пользоваться универсальным средством, который подходит когда эти таймеры заканчиваются.

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
Название: Re: Время выполнения цикла
Отправлено: Prographer от Июнь 27, 2016, 05:33:46 pm
Помимо двух таймеров, которые есть у каждого скрипта потока, можно пользоваться универсальным средством, который подходит когда эти таймеры заканчиваются.

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
О! Интересный вариант. Спасибо, попробую :)