Автор Тема: Время выполнения цикла  (Прочитано 629 раз)

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Время выполнения цикла
« : Июнь 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. Кому интересно, прикладываю весь скрипт.
« Последнее редактирование: Июнь 26, 2016, 12:26:51 am от Prographer »

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Время выполнения цикла
« Ответ #1 : Июнь 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

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 500
  • Репутация: +43/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Время выполнения цикла
« Ответ #2 : Июнь 26, 2016, 09:29:57 am »
Можно еще использовать игровой таймер 0x974B2C

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 174
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Время выполнения цикла
« Ответ #3 : Июнь 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
I know everything and nothing...

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Время выполнения цикла
« Ответ #4 : Июнь 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
О! Интересный вариант. Спасибо, попробую :)