Перейти к основному содержимому

Назад: Файлы сохранений

Реальное время

Прежде всего следует понимать, что весь код в 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

Смотрите так же, как реализуется игровое время, не привязанное к действительному:

Вперёд: классический плеер