Инструменты пользователя

Инструменты сайта


help:realtime

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
help:realtime [2017/05/05 15:20]
aleks_versus
help:realtime [2024/10/14 12:52] (текущий)
aleks_versus обновление 5.9.0
Строка 1: Строка 1:
-[[help:modules|Назад: ​Работа с файлами, использование модулей]] +[[help:savegame|Назад: ​Файлы сохранений]]
-=====Реальное время=====+
  
-  * **WAIT** //​[#​миллисекунды]//​ - остановка выполнения программы на заданное ​количество миллисекунд (1 секунда = 1000 миллисекунд). +====== Реальное время ======
-  * **MSECSCOUNT** - возвращает количество ​миллисекунд,​ прошедших с момента начала игры.+
  
-====События в реальном времениТаймер====+Прежде всего следует понимать, что весь код в **QSP** выполняется линейно,​ последовательно,​ команда за командой. Так же имейте ввиду, что локации (и другие блоки кода) ставятся на выполнение в очередь, и никогда код в них не выполняется одновременноПонимание двух этих простых вещей поможет вам лучше проектировать код в локации-счётчике и управлять событиями в реальном времени.
  
-В QSP есть возможность выполнять код через определённые промежутки времени — для этого используется локация-счётчик.+В **QSP** нельзя работать с текущим календарным временем. То есть **QSP** не может получать настоящие значения времени с компьютера.
  
-Чтобы локация-счётчик заработала,​ необходимо внести её название в служебную переменную ​**$COUNTER**. Например,​ если ваша локация-счётчик называется **«Счётчик»**, на самой первой локации в игре нужно написать:<​sxh qsp>$COUNTER='​Счётчик'</​sxh>​Как правило,​ чтобы не путаться,​ локацию называют так же, как и служебную переменную —**«Counter»**:<sxh qsp>$COUNTER='​Counter'</​sxh>​+===== Оператор задержки WAIT ===== 
 + 
 +''​%%WAIT%%''​ — приостановка выполнения кода программы на указанное количество миллисекунд. Общая запись:​ 
 + 
 +<sxh qsp> 
 +WAIT [#​миллисекунды] 
 +</​sxh>​ 
 + 
 +, где ''​%%[#​миллисекунды]%%''​ — время в миллисекундах,​ на какое следует остановить выполнение кода программы. 1 секунда равна 1000 миллисекунд. 
 + 
 +Пример:​ 
 + 
 +<sxh qsp> 
 +! остановка выполнения программы на 5 секунд 
 +wait 5000 
 +</​sxh>​ 
 + 
 +Использовать данный оператор нужно очень умеренно и осторожно,​ потому что он полностью блокирует для игрока возможность взаимодействия с игрой. Это может сильно раздражать. 
 + 
 +А ещё при использовании данного оператора откладывается вызов локации-счётчика,​ поэтому если вы уже используете локацию-счётчик в своей игре, использовать данный оператор противопоказано. 
 + 
 +Очень рекомендуем вообще не использовать данный оператор,​ или использовать только во время тестов,​ для задержек в различных циклических действиях,​ или визуализации процессов. 
 + 
 +В **qSpider** у игрока есть возможность кликом мыши прервать задержку и продолжить игру. 
 + 
 +===== Функция MSECSCOUNT ===== 
 + 
 +''​%%MSECSCOUNT%%''​ — в любом месте игры возвращает количество миллисекунд,​ прошедших с момента начала игры. Данная функция при использовании на локации-счётчике позволяет организовывать различные события,​ происходящие в реальном времени. Также с помощью этой функции можно делать замеры быстродействия различных участков кода в вашей игре: 
 + 
 +<sxh qsp> 
 +i=0 
 +old_time = msecscount 
 +:for 
 +if i<​100000:​ 
 +    d[i]=i 
 +    i+=1 
 +    jump '​for'​ 
 +end 
 +new_time = msecscount 
 +pl "​Скорость работы старого цикла: "​+$str(new_time-old_time) 
 + 
 +old_time = msecscount 
 +loop i=0 while i<100000 step i+=1: 
 +    b[i]=i 
 +end 
 +new_time = msecscount 
 +pl "​Скорость работы нового цикла: " + $str(new_time-old_time) 
 +</​sxh>​ 
 + 
 +Максимальное число, которое может вернуть данная функция,​ это **2147483647**. Не трудно посчитать,​ что этого хватит более, чем на **550** часов игры. 
 + 
 +===== События в реальном времени. Таймер ===== 
 + 
 +В **QSP** есть возможность выполнять код через определённые промежутки времени — для этого используется локация-счётчик. 
 + 
 +Чтобы локация-счётчик заработала,​ необходимо внести её название в служебную переменную ​''​%%$COUNTER%%''​. Например,​ если ваша локация-счётчик называется **''​%%Счётчик%%''​**, на самой первой локации в игре нужно написать:​ 
 + 
 +<sxh qsp> 
 +$counter='​Счётчик'​ 
 +</​sxh>​ 
 + 
 +Как правило,​ чтобы не путаться,​ локацию называют так же, как и служебную переменную — **''​%%Counter%%''​**: 
 + 
 +<sxh qsp> 
 +$counter='​Counter'​ 
 +</​sxh>​
  
 Затем на созданной локации-счётчике пишут код, который должен выполняться через определённые промежутки времени. Затем на созданной локации-счётчике пишут код, который должен выполняться через определённые промежутки времени.
  
-По-умолчанию,​ код на локации-счётчике выполняется каждые пол секунды (500 миллисекунд). Но это значение можно изменить,​ использовав оператор ​**SETTIMER**:<sxh qsp>! устанавливает период выполнения кода+По умолчанию,​ код на локации-счётчике выполняется каждые пол секунды (500 миллисекунд). Но это значение можно изменить,​ использовав оператор ​''​%%SETTIMER%%''​: 
 + 
 +<sxh qsp> 
 +! устанавливает период выполнения кода
 ! на локации-счётчике в 100 миллисекунд ! на локации-счётчике в 100 миллисекунд
-SETTIMER 100</​sxh>​Комбинируя возможности операторов,​ функций и локации-счётчика,​ можно задавать множество событий,​ выполняемых в реальном времени. +SETTIMER 100 
-Для примера приведён код локации-счётчика,​ который будет выводить строки текста одну за одной каждые полторы секунды:<​sxh qsp>​settimer 20+</​sxh>​ 
 + 
 +Комбинируя возможности операторов,​ функций и локации-счётчика,​ можно задавать множество событий,​ выполняемых в реальном времени. Для примера приведён код локации-счётчика,​ который будет выводить строки текста одну за одной каждые полторы секунды:​ 
 + 
 +<sxh qsp> 
 +settimer 20
 if стихотворение=0:​ if стихотворение=0:​
- if время_первая_строка=0:​ +  ​if время_первая_строка=0:​ 
- время_первая_строка=msecscount+1500 +    время_первая_строка=msecscount+1500 
- end +  end 
- if msecscount>​=время_первая_строка:​ +  if msecscount>​=время_первая_строка:​ 
- *pl '​Веленью совести,​ о Муза, будь послушна!'​ +    *pl '​Веленью совести,​ о Муза, будь послушна!'​ 
- стихотворение=1 +    стихотворение=1 
- end+  end
 end end
 if стихотворение=1:​ if стихотворение=1:​
- if время_вторая_строка=0:​ +  ​if время_вторая_строка=0:​ 
- время_вторая_строка=msecscount+1500 +    время_вторая_строка=msecscount+1500 
- end +  end 
- if msecscount>​=время_вторая_строка:​ +  if msecscount>​=время_вторая_строка:​ 
- *pl '​Обиды не страшась,​ не требуя венца,'​ +    *pl '​Обиды не страшась,​ не требуя венца,'​ 
- стихотворение=2 +    стихотворение=2 
- end+  end
 end end
 if стихотворение=2:​ if стихотворение=2:​
- if время_третья_строка=0:​ +  ​if время_третья_строка=0:​ 
- время_третья_строка=msecscount+1500 +    время_третья_строка=msecscount+1500 
- end +  end 
- if msecscount>​=время_третья_строка:​ +  if msecscount>​=время_третья_строка:​ 
- *pl '​Хвалу и клевету приемли равнодушно'​ +    *pl '​Хвалу и клевету приемли равнодушно'​ 
- стихотворение=3 +    стихотворение=3 
- end+  end
 end end
 if стихотворение=3:​ if стихотворение=3:​
- if время_четвёртая_строка=0:​ +  ​if время_четвёртая_строка=0:​ 
- время_четвёртая_строка=msecscount+1500 +    время_четвёртая_строка=msecscount+1500 
- end +  end 
- if msecscount>​=время_четвёртая_строка:​ +  if msecscount>​=время_четвёртая_строка:​ 
- *pl 'И не оспаривай глупца.'​ +    *pl 'И не оспаривай глупца.'​ 
- стихотворение=4 +    стихотворение=4 
- end +  end 
-end</​sxh>​+end 
 +</​sxh>​ 
 + 
 +На самом деле не стоит полагаться на то, что локация-счётчик будет вызываться с заданной периодичностью,​ поскольку в действительности она не вызывается через определённые промежутки,​ а просто добавляется в очередь к вызову. 
 + 
 +Например,​ вы запустили игру, и на Стартовой локации назначили локацию-счётчик и период обращения в 20 мс, но на выполнение кода на Стартовой локации требуется 40 мс. Прервётся ли в этом случае код на стартовой локации,​ чтобы плеер выполнил код на локации-счётчике,​ а затем продолжил выполнять код на Стартовой локации?​ Нет. Плеер поставит локацию-счётчик в очередь сразу после стартовой локации,​ если к моменту,​ когда выполнение кода Стартовой локации завершится,​ пройдёт 20 мс или более. То есть первый вызов локации-счётчика произойдёт не через 20, а через 40 мс, плюс-минус пара миллисекунд. 
 + 
 +===== Оператор SETTIMER ===== 
 + 
 +''​%%SETTIMER%%''​ — задаёт интервал обращения к локации-счётчику. Общая запись:​ 
 + 
 +<sxh qsp> 
 +SETTIMER [#​выражение] 
 +</​sxh>​ 
 + 
 +, где ''​%%[#​выражение]%%''​ — период обращения к локации-счётчику в миллисекундах. По умолчанию плеер обращается к локации-счётчику каждые 500 мс., т.е. 2 раза в секунду. 
 + 
 +Установка периода обращения к локации-счётчику влияет и на частоту автоматического обновления настроек интерфейса. 
 + 
 +Примеры:​ 
 + 
 +<sxh qsp> 
 +! локация-счётчик будет запускаться каждые 2 секунды:​ 
 +settimer 2000 
 +</​sxh>​ 
 + 
 +<sxh qsp> 
 +! локация-счётчик будет запускаться 4 раза в секунду:​ 
 +settimer 250 
 +</​sxh>​ 
 + 
 +<sxh qsp> 
 +! если мы задаём частоту обращения (раз в секунду) 
 +frequency=10 & ! десять раз в секунду 
 +settimer 1000/​frequency 
 +</​sxh>​ 
 + 
 +<sxh qsp> 
 +! если мы задаём период обращения (через сколько секунд) 
 +period=2 & ! каждые две секунды 
 +settimer 1000*period 
 +</​sxh>​ 
 + 
 +Минимальное значение периода таким образом может быть 1 миллисекунда:​ 
 + 
 +<sxh qsp> 
 +settimer 1 
 +</​sxh>​ 
 + 
 +Однако на практике минимальное значение ограничено мощностью вашего компьютера,​ и оно, как правило,​ выше 1 миллисекунды. Для проверки фактического времени обращения к локации-счётчику можно использовать на локации-счётчике простой код: 
 + 
 +<sxh qsp> 
 +! settimer 1 
 +if msecscount ​ < 10000: 
 +  old = new 
 +  new = msecscount 
 +  pl new - old 
 +end 
 +</​sxh>​ 
 + 
 +В течение десяти секунд будут выводиться фактические значения времени,​ прошедшего между вызовами локации-счётчика. 
 + 
 +Если установить период обращения к локации-счётчику равный нулю, локация-счётчик не будет вызываться совсем:​
  
-=====Реализация времени в игре===== +<sxh qsp> 
-  ​[[https://​qsp.su/​index.php?​option=com_agora&​task=topic&​id=956&​Itemid=57|Юлианских календарь от evp]] +! отключаем вызовы ​локации-счётчика 
-  - [[http://​qsp.su/​index.php?​option=com_agora&​task=topic&​id=956&​Itemid=57|Реализация игрового времени]]+settimer 0 
 +</sxh>
  
-[[help:​classic_qsp|Вперёд: Классический плеер]]+Смотрите так же, как ​реализуется игровое время, не привязанное к действительному:​
  
 +  * [[https://​qsp.org/​index.php?​option=com_agora&​task=topic&​id=956&​Itemid=57|Юлианских календарь от evp]]
 +  * [[https://​qsp.org/​index.php?​option=com_agora&​task=topic&​id=956&​Itemid=57|Реализация игрового времени]]
  
 +[[help:​classic_qsp|Вперёд:​ классический плеер]]
  
help/realtime.1493997651.txt.gz · Последние изменения: 2017/05/05 15:20 — aleks_versus