Здесь показаны различия между двумя версиями данной страницы.
| Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
|
help:realtime [2015/09/18 04:01] bkz [Реализация времени в игре] |
help:realtime [2025/09/27 18:10] (текущий) aleks_versus |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | [[help:modules|Назад: Работа с файлами, использование модулей]] | + | [[help:savegame|Назад: Файлы сохранений]] |
| - | =====Реальное время===== | + | |
| - | * **WAIT** //[#миллисекунды]// - остановка выполнения программы на заданное количество миллисекунд (1 секунда = 1000 миллисекунд). | + | ====== Реальное время ====== |
| - | * **MSECSCOUNT** - возвращает количество миллисекунд, прошедших с момента начала игры. | + | |
| - | =====Реализация времени в игре===== | + | Прежде всего следует понимать, что весь код в **QSP** выполняется линейно, последовательно, команда за командой. Так же имейте ввиду, что локации (и другие блоки кода) ставятся на выполнение в очередь, и никогда код в них не выполняется одновременно. Понимание двух этих простых вещей поможет вам лучше проектировать код в локации-счётчике и управлять событиями в реальном времени. |
| - | - [[https://qsp.su/index.php?option=com_agora&task=topic&id=956&Itemid=57|Юлианских календарь от evp]] | + | |
| - | - [[https://qsp.su/index.php?option=com_agora&task=topic&id=956&Itemid=57|Реализация игрового времени]] | + | |
| - | ---- | + | |
| - | [[help:classic_qsp|Вперёд: Классический плеер]] | + | |
| + | В **QSP** нельзя работать с текущим календарным временем. То есть **QSP** не может получать настоящие значения времени с компьютера. | ||
| + | ===== Оператор задержки 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> | ||
| + | ! устанавливает период выполнения кода | ||
| + | ! на локации-счётчике в 100 миллисекунд | ||
| + | SETTIMER 100 | ||
| + | </sxh> | ||
| + | |||
| + | Комбинируя возможности операторов, функций и локации-счётчика, можно задавать множество событий, выполняемых в реальном времени. Для примера приведён код локации-счётчика, который будет выводить строки текста одну за одной каждые полторы секунды: | ||
| + | |||
| + | <sxh qsp> | ||
| + | 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 | ||
| + | </sxh> | ||
| + | |||
| + | На самом деле не стоит полагаться на то, что локация-счётчик будет вызываться с заданной периодичностью, поскольку в действительности она вызывается не через равные промежутки. | ||
| + | |||
| + | Допустим выполняется код какой-то локации, и тут подошло время выполнить код локации-счётчика. Однако, поскольку плеер уже занят выполнением кода другой локации, он просто пропустит вызов локации-счётчика, и попытается вызвать её в следующий раз. На это ещё может наложиться реальное время выполнения операций в компьютере, и вот вы уже вместо 500 мс интервала имеете +-25 мс. | ||
| + | |||
| + | ===== Оператор 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> | ||
| + | ! отключаем вызовы локации-счётчика | ||
| + | settimer 0 | ||
| + | </sxh> | ||
| + | |||
| + | Смотрите так же, как реализуется игровое время, не привязанное к действительному: | ||
| + | |||
| + | * [[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|Вперёд: классический плеер]] | ||