- Вывод текста
- Программирование
- Оформление
- Расширенные возможности
- Нюансы написания игр под разные плееры
-
- x AeroQSP
- Утилиты и средства разработки
Это старая версия документа.
Прежде всего следует понимать, что весь код в QSP выполняется линейно, последовательно, команда за командой. Так же имейте ввиду, что локации (и другие блоки кода) ставятся на выполнение в очередь, и никогда код в них не выполняется одновременно. Понимание двух этих простых вещей поможет вам лучше проектировать код в локации-счётчике и управлять событиями в реальном времени.
В QSP нельзя работать с текущим календарным временем. То есть QSP не может получать настоящие значения времени с компьютера.
WAIT
— приостановка выполнения кода программы на указанное количество миллисекунд. Общая запись:
WAIT [#миллисекунды], где
[#миллисекунды]
— время в миллисекундах, на какое следует остановить выполнение кода программы. 1 секунда равна 1000 миллисекунд.
Пример:
! остановка выполнения программы на 5 секунд wait 5000
Использовать данный оператор нужно очень умеренно и осторожно, потому что он полностью блокирует для игрока возможность взаимодействия с игрой. Это может сильно раздражать.
А ещё при использовании данного оператора откладывается вызов локации-счётчика, поэтому если вы уже используете локацию-счётчик в своей игре, использовать данный оператор противопоказано.
Очень рекомендуем вообще не использовать данный оператор, или использовать только во время тестов, для задержек в различных циклических действиях, или визуализации процессов.
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 [#выражение], где
[#выражение]
— период обращения к локации-счётчику в миллисекундах. По умолчанию плеер обращается к локации-счётчику каждые 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
Смотрите так же, как реализуется игровое время, не привязанное к действительному: