[[help:savegame|Назад: Файлы сохранений]]
====== Реальное время ======
Прежде всего следует понимать, что весь код в **QSP** выполняется линейно, последовательно, команда за командой. Так же имейте ввиду, что локации (и другие блоки кода) ставятся на выполнение в очередь, и никогда код в них не выполняется одновременно. Понимание двух этих простых вещей поможет вам лучше проектировать код в локации-счётчике и управлять событиями в реальном времени.
В **QSP** нельзя работать с текущим календарным временем. То есть **QSP** не может получать настоящие значения времени с компьютера.
===== Оператор задержки WAIT =====
''%%WAIT%%'' — приостановка выполнения кода программы на указанное количество миллисекунд. Общая запись:
WAIT [#миллисекунды]
, где ''%%[#миллисекунды]%%'' — время в миллисекундах, на какое следует остановить выполнение кода программы. 1 секунда равна 1000 миллисекунд.
Пример:
! остановка выполнения программы на 5 секунд
wait 5000
Использовать данный оператор нужно очень умеренно и осторожно, потому что он полностью блокирует для игрока возможность взаимодействия с игрой. Это может сильно раздражать.
А ещё при использовании данного оператора откладывается вызов локации-счётчика, поэтому если вы уже используете локацию-счётчик в своей игре, использовать данный оператор противопоказано.
Очень рекомендуем вообще не использовать данный оператор, или использовать только во время тестов, для задержек в различных циклических действиях, или визуализации процессов.
В **qSpider** у игрока есть возможность кликом мыши прервать задержку и продолжить игру.
===== Функция MSECSCOUNT =====
''%%MSECSCOUNT%%'' — в любом месте игры возвращает количество миллисекунд, прошедших с момента начала игры. Данная функция при использовании на локации-счётчике позволяет организовывать различные события, происходящие в реальном времени. Также с помощью этой функции можно делать замеры быстродействия различных участков кода в вашей игре:
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)
Максимальное число, которое может вернуть данная функция, это **2147483647**. Не трудно посчитать, что этого хватит более, чем на **550** часов игры.
===== События в реальном времени. Таймер =====
В **QSP** есть возможность выполнять код через определённые промежутки времени — для этого используется локация-счётчик.
Чтобы локация-счётчик заработала, необходимо внести её название в служебную переменную ''%%$COUNTER%%''. Например, если ваша локация-счётчик называется **''%%Счётчик%%''**, на самой первой локации в игре нужно написать:
$counter='Счётчик'
Как правило, чтобы не путаться, локацию называют так же, как и служебную переменную — **''%%Counter%%''**:
$counter='Counter'
Затем на созданной локации-счётчике пишут код, который должен выполняться через определённые промежутки времени.
По умолчанию, код на локации-счётчике выполняется каждые пол секунды (500 миллисекунд). Но это значение можно изменить, использовав оператор ''%%SETTIMER%%'':
! устанавливает период выполнения кода
! на локации-счётчике в 100 миллисекунд
SETTIMER 100
Комбинируя возможности операторов, функций и локации-счётчика, можно задавать множество событий, выполняемых в реальном времени. Для примера приведён код локации-счётчика, который будет выводить строки текста одну за одной каждые полторы секунды:
settimer 20
if стихотворение=0:
if время_первая_строка=0:
время_первая_строка=msecscount+1500
end
if msecscount>=время_первая_строка:
*pl 'Веленью совести, о Муза, будь послушна!'
стихотворение=1
end
end
if стихотворение=1:
if время_вторая_строка=0:
время_вторая_строка=msecscount+1500
end
if msecscount>=время_вторая_строка:
*pl 'Обиды не страшась, не требуя венца,'
стихотворение=2
end
end
if стихотворение=2:
if время_третья_строка=0:
время_третья_строка=msecscount+1500
end
if msecscount>=время_третья_строка:
*pl 'Хвалу и клевету приемли равнодушно'
стихотворение=3
end
end
if стихотворение=3:
if время_четвёртая_строка=0:
время_четвёртая_строка=msecscount+1500
end
if msecscount>=время_четвёртая_строка:
*pl 'И не оспаривай глупца.'
стихотворение=4
end
end
На самом деле не стоит полагаться на то, что локация-счётчик будет вызываться с заданной периодичностью, поскольку в действительности она не вызывается через определённые промежутки, а просто добавляется в очередь к вызову.
Например, вы запустили игру, и на Стартовой локации назначили локацию-счётчик и период обращения в 20 мс, но на выполнение кода на Стартовой локации требуется 40 мс. Прервётся ли в этом случае код на стартовой локации, чтобы плеер выполнил код на локации-счётчике, а затем продолжил выполнять код на Стартовой локации? Нет. Плеер поставит локацию-счётчик в очередь сразу после стартовой локации, если к моменту, когда выполнение кода Стартовой локации завершится, пройдёт 20 мс или более. То есть первый вызов локации-счётчика произойдёт не через 20, а через 40 мс, плюс-минус пара миллисекунд.
===== Оператор SETTIMER =====
''%%SETTIMER%%'' — задаёт интервал обращения к локации-счётчику. Общая запись:
SETTIMER [#выражение]
, где ''%%[#выражение]%%'' — период обращения к локации-счётчику в миллисекундах. По умолчанию плеер обращается к локации-счётчику каждые 500 мс., т.е. 2 раза в секунду.
Установка периода обращения к локации-счётчику влияет и на частоту автоматического обновления настроек интерфейса.
Примеры:
! локация-счётчик будет запускаться каждые 2 секунды:
settimer 2000
! локация-счётчик будет запускаться 4 раза в секунду:
settimer 250
! если мы задаём частоту обращения (раз в секунду)
frequency=10 & ! десять раз в секунду
settimer 1000/frequency
! если мы задаём период обращения (через сколько секунд)
period=2 & ! каждые две секунды
settimer 1000*period
Минимальное значение периода таким образом может быть 1 миллисекунда:
settimer 1
Однако на практике минимальное значение ограничено мощностью вашего компьютера, и оно, как правило, выше 1 миллисекунды. Для проверки фактического времени обращения к локации-счётчику можно использовать на локации-счётчике простой код:
! settimer 1
if msecscount < 10000:
old = new
new = msecscount
pl new - old
end
В течение десяти секунд будут выводиться фактические значения времени, прошедшего между вызовами локации-счётчика.
Если установить период обращения к локации-счётчику равный нулю, локация-счётчик не будет вызываться совсем:
! отключаем вызовы локации-счётчика
settimer 0
Смотрите так же, как реализуется игровое время, не привязанное к действительному:
* [[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|Вперёд: классический плеер]]