Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:principle [2022/12/30 17:23] aleks_versus почти полностью переписана |
help:principle [2024/10/14 07:28] (текущий) aleks_versus проба обновления до 5.9.0 |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | |||
[[help:objs|Назад: Предметы]] | [[help:objs|Назад: Предметы]] | ||
====== Порядок работы интерпретатора ====== | ====== Порядок работы интерпретатора ====== | ||
- | **__Несмотря на то, что эта статья обросла некоторыми подробностями, она всё ещё требует серьёзной редактуры, упрощения и расширения. Так что пока что это всё ещё черновой вариант.__** | + | **Несмотря на то, что эта статья обросла некоторыми подробностями, она всё ещё требует серьёзной редактуры, упрощения и расширения. Так что пока что это всё ещё черновой вариант.** |
Эта статья подробно рассказывает о порядке работы интерпретатора (плеера) **QSP**. Она может показаться вам довольно сложной, но читать её всю не обязательно. Вернитесь к ней, когда у вас возникнут сложности в понимании того, как ведёт себя плеер. А пока достаточно ознакомиться с общими принципами: | Эта статья подробно рассказывает о порядке работы интерпретатора (плеера) **QSP**. Она может показаться вам довольно сложной, но читать её всю не обязательно. Вернитесь к ней, когда у вас возникнут сложности в понимании того, как ведёт себя плеер. А пока достаточно ознакомиться с общими принципами: | ||
- | * При запуске игры автоматически воспроизводится только самая первая в игре локация. На остальные локации нужно осуществлять переходы с помощью ''**GOTO**'' или ''**XGOTO**'', или вызывать их с помощью ''**GOSUB**'', ''**FUNC**'', или иным предусмотренным плеером способом. | + | |
- | * Код действий "прикрепляется" к действию и не выполняется, пока игрок не нажмёт на действие. | + | * При запуске игры автоматически воспроизводится только самая первая в игре локация. На остальные локации нужно осуществлять переходы с помощью **''GOTO''** или **''XGOTO''**, или вызывать их с помощью **''GOSUB''**, **''FUNC''**, или иным предусмотренным плеером способом. |
- | * Все команды выполняются последовательно одна за другой, и никогда не выполняются одновременно. | + | * Код действий "прикрепляется" к действию и не выполняется, пока игрок не нажмёт на действие. |
+ | * Все команды выполняются последовательно одна за другой, и никогда не выполняются одновременно. | ||
Ниже по тексту будут использоваться следующие определения: | Ниже по тексту будут использоваться следующие определения: | ||
- | * **Переход на локацию** — это событие в игре, которое происходит при обращении к локации с помощью операторов ''**GOTO**'' или ''**XGOTO**''. При этом локация становится "активной", или "текущей". Функция ''**$CURLOC**'' возвращает название локации, на которую был совершён переход, а массив ''**ARGS[]**'' этой локации сохраняет свои значения, пока снова не будет осуществлён переход на локацию (другую, или ту же самую). После добавления текста из поля "Базовое описание" в Окно основного описания, действий из поля "Базовые действия" в Окно действий, и выполнения кода из поля "Выполнить при посещении", плеер "останавливается" и ожидает участия игрока, при этом локация, на которую был осуществлён переход, остаётся "активной" ("текущей"), т.е. функция ''**$CURLOC**'' в любой момент может вернуть название этой локации, а массив ''**ARGS[]**'' сохраняет значения.\\ Для переходов существуют только два оператора (подробнее см. статью [[help:goto|"Переходы"]]): | + | * **Переход на локацию** — это событие в игре, которое происходит при обращении к локации с помощью операторов **''GOTO''** или **''XGOTO''**. При этом локация становится "активной", или "текущей". Функция **''$CURLOC''** возвращает название локации, на которую был совершён переход, а массив **''ARGS[]''** этой локации сохраняет свои значения, пока снова не будет осуществлён переход на локацию (другую, или ту же самую). После добавления текста из поля "Базовое описание" в Окно основного описания, действий из поля "**Базовые действия**" в **Окно действий**, и выполнения кода из поля "**Выполнить при посещении**", плеер "останавливается" и ожидает участия игрока, при этом локация, на которую был осуществлён переход, остаётся "активной" ("текущей"), т.е. функция **''$CURLOC''** в любой момент может вернуть название этой локации, а массив ''ARGS[]'' сохраняет значения.\\ Для переходов существуют только два оператора (подробнее см. статью [[help:goto|"Переходы"]]): |
- | * ''**GOTO**'' — осуществляет переход на указанную локацию с автоматической очисткой Окна основного описания и Окна действий. | + | * **''GOTO''** — осуществляет переход на указанную локацию с автоматической очисткой **Окна основного описания** и **Окна действий**. |
- | * ''**XGOTO**'' — осуществляет переход на указанную локацию с автоматической очисткой Окна действий. Окно основного описания НЕ очищается. | + | * **''XGOTO''** — осуществляет переход на указанную локацию с автоматической очисткой **Окна действий**. **Окно основного описания** НЕ очищается. |
- | * **Вызов локации** — это событие в игре, которое происходит при обращении к локации с помощью оператора ''**GOSUB**'', функции ''**FUNC**'', или в связи с выполнением другого события (например, "Выделение предмета", "Загрузка сохранения", "Ввод в поле ввода", "Выбор пункта меню"). В отличие от **перехода на локацию**, при **вызове** локация не становится "активной" ("текущей"), т.е. функция ''**$CURLOC**'' не возвращает название этой локации, а массив ''**ARGS[]**'' сохраняет свои значения только пока выполняется код локации. После выполнения кода локации, продолжается выполнение того блока кода, который выполнялся до вызова. Например, если локация была **вызвана** из действия, то после выполнения её кода, продолжится выполнение кода действия, при этом в массив ''**ARGS[]**'' внутри действия не попадут значения массива ''**ARGS[]**'' из вызванной локации. При вызове локации в Окно основного описания добавляется текст из поля "Базовое описание" локации, в Окно действий добавляются действия из поля "Базовые действия" локации, и выполняется код из поля "Выполнить при посещении" локации. Очистка окон при вызове локации НЕ ПРОИСХОДИТ.<sxh qsp> | + | * **Вызов локации** — это событие в игре, которое происходит при обращении к локации с помощью оператора **''GOSUB''**, функции **''FUNC''**, или в связи с выполнением другого события (например, "**Выделение предмета**", "**Загрузка сохранения**", "**Ввод в поле ввода**", "**Выбор пункта меню**"). В отличие от **перехода на локацию**, при **вызове** локация не становится "активной" ("текущей"), т.е. функция **''$CURLOC''** не возвращает название этой локации, а массив **''ARGS[]''** сохраняет свои значения только пока выполняется код локации. После выполнения кода локации, продолжается выполнение того блока кода, который выполнялся до вызова. Например, если локация была **вызвана** из действия, то после выполнения её кода, продолжится выполнение кода действия, при этом в массив **''ARGS[]''** внутри действия не попадут значения массива **''ARGS[]''** из вызванной локации. При вызове локации в **Окно основного описания** добавляется текст из поля "**Базовое описание**" локации, в **Окно действий** добавляются действия из поля "**Базовые действия**" локации, и выполняется код из поля "**Выполнить при посещении**" локации. Очистка окон при вызове локации НЕ ПРОИСХОДИТ. <sxh qsp> |
- | act "Действие с вызовом локации": | + | act "Действие с вызовом локации": |
- | *pl "Выводим текст до вызова" | + | *pl "Выводим текст до вызова" |
- | gosub 'foo' & ! вызываем локацию foo | + | gosub 'foo' & ! вызываем локацию foo |
- | *pl "Продолжаем выполнять код после вызова локации foo" | + | *pl "Продолжаем выполнять код после вызова локации foo" |
- | end | + | end |
- | </sxh> | + | </sxh> Вызвать локацию можно разными способами: |
- | Вызвать локацию можно разными способами: | + | * Оператор **''GOSUB''** вызывает локацию без возвращения результата (подробнее в статье [[help:organizing|"Пользовательские функции и процедуры"]]). |
- | * Оператор ''**GOSUB**'' вызывает локацию без возвращения результата (подробнее в статье [[help:organizing|"Пользовательские функции и процедуры"]]). | + | * Оператор **FUNC** вызывает локацию с возвращением результата (подробнее в статье [[help:organizing|"Пользовательские функции и процедуры"]]). |
- | * Оператор **FUNC** вызывает локацию с возвращением результата (подробнее в статье [[help:organizing|"Пользовательские функции и процедуры"]]). | + | * Нажатием пункта всплывающего меню (см. статью [[help:menu|"Всплывающее меню"]]) |
- | * Нажатием пункта всплывающего меню (см. статью [[help:menu|"Всплывающее меню"]]) | + | * Выполнением какого-либо события в игре, как то: "Выделение предмета", "Выделение действия", "Загрузка сохранения", "Ввод текста в поле ввода" и т.д. (подробнее в статье [[help:service_locations|"Служебные локации"]]). |
- | * Выполнением какого-либо события в игре, как то: "Выделение предмета", "Выделение действия", "Загрузка сохранения", "Ввод текста в поле ввода" и т.д. (подробнее в статье [[help:service_locations|"Служебные локации"]]). | + | * **Блок кода** — это выделенный в отдельное целое фрагмент кода игры. Отдельными блоками кода в **QSP** являются: |
- | * **Блок кода** — это выделенный в отдельное целое фрагмент кода игры. Отдельными блоками кода в **QSP** являются: | + | * Локации сами со себе. |
- | * Локации сами со себе. | + | * Код, передаваемый оператору **''DYNAMIC''** или функции **''DYNEVAL''** в виде текста. |
- | * Код, передаваемый оператору ''**DYNAMIC**'' или функции ''**DYNEVAL**'' в виде текста. | + | * Код, выполняемый при нажатии на гиперссылку. |
- | * Код, выполняемый при нажатии на гиперссылку. | + | * Код каждого отдельного Действия (**[[help:acts|ACT]]**). |
- | * Код каждого отдельного Действия (**[[help:acts|ACT]]**). | + | * Код каждого отдельного Цикла (**[[help:cycle|LOOP]]**) |
- | * Код каждого отдельного Цикла (**[[help:cycle|LOOP]]**) | + | |
===== Запуск игры ===== | ===== Запуск игры ===== | ||
Строка 39: | Строка 38: | ||
Каждая игра на **QSP** структурно представляет собой набор локаций, последовательно записанных в файл. | Каждая игра на **QSP** структурно представляет собой набор локаций, последовательно записанных в файл. | ||
- | Когда мы открываем игру в плеере (интерпретаторе), автоматически запускается чтение самой первой локации в файле (далее **Стартовая локация**), как если бы на неё был совершён переход с помощью оператора ''**GOTO**''. То есть: | + | Когда мы открываем игру в плеере (интерпретаторе), автоматически запускается чтение самой первой локации в файле (далее **Стартовая локация**), как если бы на неё был совершён переход с помощью оператора **''GOTO''**. То есть: |
- | * В Окно основного описания добавляется текст из поля "Базовое описание" локации (поле "Описание" в **Quest Generator**). | + | * В Окно основного описания добавляется текст из поля "**Базовое описание**" локации (поле "**Описание**" в **Quest Generator**). |
- | * В Окно действий добавляются действия из поля "Базовые действия" локации (поле "Базовые действия" в **Quest Generator**). | + | * В Окно действий добавляются действия из поля "**Базовые действия**" локации (поле "**Базовые действия**" в **Quest Generator**). |
- | * Выполняется код из поля "Выполнить при посещении" локации. | + | * Выполняется код из поля "**Выполнить при посещении**" локации. |
- | * Если на Стартовой локации в переменную ''**$ONNEWLOC**'' было помещено название локации-обработчика события "Переход на новую локацию", произойдёт автоматический вызов этой самой локации-обработчика события "Переход на новую локацию" (см. [[help:service_locations|"Служебные локации"]]). | + | * Если на Стартовой локации в переменную **''$ONNEWLOC''** было помещено название локации-обработчика события "**Переход на новую локацию**", произойдёт автоматический вызов этой самой локации-обработчика события "**Переход на новую локацию**" (см. [[help:service_locations|"Служебные локации"]]). |
- | * После того, как Стартовая локация была прочитана, плеер "останавливается" и ожидает действий от игрока. При этом локация остаётся "активной", т.е. функция ''**$CURLOC**'' в любой момент может вернуть её название, а в массиве ''**ARGS[]**'' данной локации сохраняются значения, которые на ней были выставлены, и эти значения могут использоваться, например, в действиях, выведенных в **Окно действий**. | + | * После того, как Стартовая локация была прочитана, плеер "останавливается" и ожидает действий от игрока. При этом локация остаётся "активной", т.е. функция **''$CURLOC''** в любой момент может вернуть её название, а в массиве **''ARGS[]''** данной локации сохраняются значения, которые на ней были выставлены, и эти значения могут использоваться, например, в действиях, выведенных в **Окно действий**. |
- | Если на Стартовой локации в переменную ''**$COUNTER**'' было помещено название локации-счётчика, примерно через равные промежутки времени (по умолчанию раз в пол секунды) плеер будет вызывать локацию-счётчик (см. [[help:service_locations|"Служебные локации"]]). | + | Если на Стартовой локации в переменную **''$COUNTER''** было помещено название локации-счётчика, примерно через равные промежутки времени (по умолчанию раз в пол секунды) плеер будет вызывать локацию-счётчик (см. [[help:service_locations|"Служебные локации"]]). |
===== Выполнение кода ===== | ===== Выполнение кода ===== | ||
Строка 67: | Строка 66: | ||
<sxh qsp> | <sxh qsp> | ||
if 5>6: | if 5>6: | ||
- | *pl "Данная команда никогда не будет выполнена" | + | *pl "Данная команда никогда не будет выполнена" |
end | end | ||
</sxh> | </sxh> | ||
- | Команды, стоящие после ''**GOTO**'' или ''**XGOTO**'', так же никогда не будут выполнены: | + | Команды, стоящие после **''GOTO''** или **''XGOTO''**, так же никогда не будут выполнены: |
<sxh qsp> | <sxh qsp> | ||
*pl "Текст на локации" & ! этот текст будет виден на локации всегда | *pl "Текст на локации" & ! этот текст будет виден на локации всегда | ||
act "Переход по XGOTO": | act "Переход по XGOTO": | ||
- | *pl "Этот текст виден благодаря тому, что вы перешли с помощью XGOTO" | + | *pl "Этот текст виден благодаря тому, что вы перешли с помощью XGOTO" |
- | xgoto $curloc & ! переходим на текущую локацию | + | xgoto $curloc & ! переходим на текущую локацию |
- | *pl "А эта команда никогда не будет выполнена" | + | *pl "А эта команда никогда не будет выполнена" |
end | end | ||
+ | |||
act "Переход по GOTO": | act "Переход по GOTO": | ||
- | *pl "Эта команда будет выполнена" | + | *pl "Эта команда будет выполнена" |
- | ! но при переходе по GOTO Окно основного описания очистится, | + | ! но при переходе по GOTO Окно основного описания очистится, |
- | ! так что эту строчку вы всё равно не увидите. | + | ! так что эту строчку вы всё равно не увидите. |
- | goto $curloc & ! переходим на текущую локацию | + | goto $curloc & ! переходим на текущую локацию |
- | *pl "А эта команда никогда не будет выполнена" | + | *pl "А эта команда никогда не будет выполнена" |
end | end | ||
</sxh> | </sxh> | ||
- | Код действий (''**ACT**'') не выполняется сразу, а "прикрепляется" к этим действиям. Он будет выполнен только тогда, когда игрок нажмёт на соответствующее действие. | + | Код действий (**''ACT''**) не выполняется сразу, а "прикрепляется" к этим действиям. Он будет выполнен только тогда, когда игрок нажмёт на соответствующее действие. |
<sxh qsp> | <sxh qsp> | ||
Строка 95: | Строка 95: | ||
! создаём действие | ! создаём действие | ||
act "Вывести значение переменной example": | act "Вывести значение переменной example": | ||
- | *pl example | + | *pl example |
end | end | ||
example=37 & ! меняем значение в переменной | example=37 & ! меняем значение в переменной | ||
Строка 110: | Строка 110: | ||
</sxh> | </sxh> | ||
- | При выполнении команды, которая содержит строки с вложенными выражениями | + | При выполнении команды, которая содержит строки с вложенными выражениями, сначала раскрываются вложенные выражения, и только затем происходит работа со строкой, например, передача её оператору для вывода на экран: |
+ | |||
+ | <sxh qsp> | ||
+ | яблоки = 23 | ||
+ | ! Сначала в строку подставится значение, | ||
+ | ! потом строка выведется на экран: | ||
+ | *pl "Яблок в кармане: <<яблоки>>." | ||
+ | </sxh> | ||
===== Переход на новую локацию ===== | ===== Переход на новую локацию ===== | ||
- | Переход на новую локацию может осуществляться с помощью двух операторов ''**GOTO**'' и ''**XGOTO**''. Различие в их работе заключается в следующем: | + | Переход на новую локацию может осуществляться с помощью двух операторов **''GOTO''** и **''XGOTO''**. Различие в их работе заключается в следующем: |
- | * При переходе с помощью оператора ''**GOTO**'' очищаются Окно основного описания и Окно действий. | + | |
- | * При переходе с помощью оператора ''**XGOTO**'' очищается только Окно действий. Окно основного описания не очищается. | + | * При переходе с помощью оператора **''GOTO''** очищаются Окно основного описания и Окно действий. |
+ | * При переходе с помощью оператора **''XGOTO''** очищается только Окно действий. Окно основного описания не очищается. | ||
В остальном работа этих операторов схожа: | В остальном работа этих операторов схожа: | ||
- | * В Окно основного описания добавляется текст из поля "Базовое описание" локации (поле "Описание" в **Quest Generator**). | ||
- | * В Окно действий добавляются действия из поля "Базовые действия" локации (поле "Базовые действия" в **Quest Generator**). | ||
- | * Выполняется код из поля "Выполнить при посещении" локации. | ||
- | * Если в переменную ''**$ONNEWLOC**'' было помещено название локации-обработчика события "Переход на новую локацию", произойдёт автоматический вызов этой самой локации-обработчика события "Переход на новую локацию" (см. [[help:service_locations|"Служебные локации"]]). | ||
- | * После этого плеер "останавливается" и ожидает действий от игрока. При этом локация остаётся "активной", т.е. функция ''**$CURLOC**'' в любой момент может вернуть её название, а в массиве ''**ARGS[]**'' данной локации сохраняются значения, которые на ней были выставлены, и эти значения могут использоваться, например, в действиях, выведенных в **Окно действий**. | ||
- | Если в переменную ''**$COUNTER**'' было помещено название локации-счётчика, примерно через равные промежутки времени (по умолчанию раз в пол секунды) плеер будет вызывать локацию-счётчик (см. [[help:service_locations|"Служебные локации"]]). | + | * В Окно основного описания добавляется текст из поля "Базовое описание" локации (поле "Описание" в **Quest Generator**). |
+ | * В Окно действий добавляются действия из поля "Базовые действия" локации (поле "Базовые действия" в **Quest Generator**). | ||
+ | * Выполняется код из поля "Выполнить при посещении" локации. | ||
+ | * Если в переменную **''$ONNEWLOC''** было помещено название локации-обработчика события "Переход на новую локацию", произойдёт автоматический вызов этой самой локации-обработчика события "Переход на новую локацию" (см. [[help:service_locations|"Служебные локации"]]). | ||
+ | * После этого плеер "останавливается" и ожидает действий от игрока. При этом локация остаётся "активной", т.е. функция **''$CURLOC''** в любой момент может вернуть её название, а в массиве **''ARGS[]''** данной локации сохраняются значения, которые на ней были выставлены, и эти значения могут использоваться, например, в действиях, выведенных в **Окно действий**. | ||
+ | |||
+ | Если в переменную **''$COUNTER''** было помещено название локации-счётчика, примерно через равные промежутки времени (по умолчанию раз в пол секунды) плеер будет вызывать локацию-счётчик (см. [[help:service_locations|"Служебные локации"]]). | ||
P.S.: "Переход на новую локацию" — это устоявшееся название события. Технически более правильно называть такие переходы просто "Переход на локацию", поскольку мы можем переходить не только на новые, но и на текущую локацию: | P.S.: "Переход на новую локацию" — это устоявшееся название события. Технически более правильно называть такие переходы просто "Переход на локацию", поскольку мы можем переходить не только на новые, но и на текущую локацию: | ||
+ | |||
<sxh qsp> | <sxh qsp> | ||
"Счёт: <<count>>" | "Счёт: <<count>>" | ||
act "Обновить": | act "Обновить": | ||
- | count+=1 | + | count+=1 |
- | goto $curloc & ! перезаходим на текущую локацию | + | goto $curloc & ! перезаходим на текущую локацию |
end | end | ||
</sxh> | </sxh> | ||
+ | |||
Поэтому, столкнувшись с выражением "Переход на новую локацию" помните, что оно может значить в том числе и переход на текущую локацию. | Поэтому, столкнувшись с выражением "Переход на новую локацию" помните, что оно может значить в том числе и переход на текущую локацию. | ||
Строка 142: | Строка 153: | ||
При вызове: | При вызове: | ||
- | * В Окно основного описания добавляется текст из поля "Базовое описание" локации (поле "Описание" в **Quest Generator**). | ||
- | * В Окно действий добавляются действия из поля "Базовые действия" локации (поле "Базовые действия" в **Quest Generator**). | ||
- | * Выполняется код из поля "Выполнить при посещении" локации. | ||
- | Дополнительно, при вызове с помощью оператора ''**GOSUB**'', или функции ''**FUNC**'', а так же с помощью оператора [[help:menu|**MENU**]], осуществляется возврат к тому коду, из которого был осуществлён вызов, и продолжается выполнение этого кода. Например, если локация была вызвана из действия, то произойдёт возврат к выполнению кода действия. | + | * В Окно основного описания добавляется текст из поля "Базовое описание" локации (поле "Описание" в **Quest Generator**). |
+ | * В Окно действий добавляются действия из поля "Базовые действия" локации (поле "Базовые действия" в **Quest Generator**). | ||
+ | * Выполняется код из поля "Выполнить при посещении" локации. | ||
+ | |||
+ | Дополнительно, при вызове с помощью оператора **''GOSUB''**, или функции **''FUNC''**, а так же с помощью оператора [[help:menu|**MENU**]], осуществляется возврат к тому коду, из которого был осуществлён вызов, и продолжается выполнение этого кода. Например, если локация была вызвана из действия, то произойдёт возврат к выполнению кода действия. | ||
<sxh qsp> | <sxh qsp> | ||
act "Действие с вызовом локации": | act "Действие с вызовом локации": | ||
- | *pl "Выводим текст до вызова" | + | *pl "Выводим текст до вызова" |
- | gosub 'foo' & ! вызываем локацию foo | + | gosub 'foo' & ! вызываем локацию foo |
- | *pl "Продолжаем выполнять код после вызова локации foo" | + | *pl "Продолжаем выполнять код после вызова локации foo" |
end | end | ||
</sxh> | </sxh> | ||
- | Более подробно работа оператора ''**GOSUB**'' и функции ''**FUNC**'' освещена в разделе [[help:organizing|"Пользовтальские функции и процедуры"]]. | + | Более подробно работа оператора **''GOSUB''** и функции **''FUNC''** освещена в разделе [[help:organizing|"Пользовтальские функции и процедуры"]]. |
- | О работе оператора ''**MENU**'' более подробно можно почитать в разделе [[help:menu|"Меню"]]. | + | О работе оператора **''MENU''** более подробно можно почитать в разделе [[help:menu|"Меню"]]. |
===== Обработка событий ===== | ===== Обработка событий ===== | ||
Строка 163: | Строка 176: | ||
События, если смотреть на это понятие с точки зрения работы плеера, — это некое изменение состояния в написанной нами игре. Например, у нас все предметы были не выделены, и вот игрок щёлкает мышью по одному из предметов, и предмет оказывается выделен. То есть предмет изменил своё состояние с "не выделен", на "выделен". Это и есть **событие выделения предмета**. | События, если смотреть на это понятие с точки зрения работы плеера, — это некое изменение состояния в написанной нами игре. Например, у нас все предметы были не выделены, и вот игрок щёлкает мышью по одному из предметов, и предмет оказывается выделен. То есть предмет изменил своё состояние с "не выделен", на "выделен". Это и есть **событие выделения предмета**. | ||
- | Конечно, мы могли бы и сами отслеживать некоторые события, например, с помощью локации-счётчика постоянно проверять, какое значение возвращает нам функция ''**$SELOBJ**'', и в момент, когда функция изменяет своё значение с одного на другое, мы точно знаем, что произошло выделение нового предмета, или иными словами: событие "Выделение предмета". Однако, для нас это, во-первых, лишний код, а, во-вторых, очень неудобный и неточный инструмент по отслеживанию событий, поскольку локация-счётчик имеет ряд ограничений и на скорость выполнения, и на очерёдность. Мы хотим, чтобы милисекунда в милисекунду мы знали, что какое-то событие произошло, и чтобы при этом мы могли выполнить какой-либо код. | + | Конечно, мы могли бы и сами отслеживать некоторые события, например, с помощью локации-счётчика постоянно проверять, какое значение возвращает нам функция **''$SELOBJ''**, и в момент, когда функция изменяет своё значение с одного на другое, мы точно знаем, что произошло выделение нового предмета, или иными словами: событие "Выделение предмета". Однако, для нас это, во-первых, лишний код, а, во-вторых, очень неудобный и неточный инструмент по отслеживанию событий, поскольку локация-счётчик имеет ряд ограничений и на скорость выполнения, и на очерёдность. Мы хотим, чтобы миллисекунда в миллисекунду мы знали, что какое-то событие произошло, и чтобы при этом мы могли выполнить какой-либо код. |
Именно для этого в **QSP** введены специальные служебные локации: локации-обработчики событий (и локация-счётчик). | Именно для этого в **QSP** введены специальные служебные локации: локации-обработчики событий (и локация-счётчик). | ||
Любая локация, названная как угодно, и написанная каким угодно образом, может быть назначена обработчиком-события или локацией-счётчиком. Для этого название этой локации нужно прописать в специальную системную переменную. Например: | Любая локация, названная как угодно, и написанная каким угодно образом, может быть назначена обработчиком-события или локацией-счётчиком. Для этого название этой локации нужно прописать в специальную системную переменную. Например: | ||
+ | |||
<sxh qsp> | <sxh qsp> | ||
- | $counter='счётчик' & ! назначаем локацию-счётчик | + | $counter = 'счётчик' & ! назначаем локацию-счётчик |
- | $onobjsel='onClick' & ! назначаем локацию-обработчик события "Выделение предмета" | + | $onobjsel = 'onClick' & ! назначаем локацию-обработчик события "Выделение предмета" |
- | $usercom='debugger' & ! назначаем локацию-обработчик события "Нажатие клавиши ввода в Поле ввода" | + | $usercom = 'debugger' & ! назначаем локацию-обработчик события "Нажатие клавиши ввода в Поле ввода" |
</sxh> | </sxh> | ||
Строка 179: | Строка 193: | ||
Чтобы отвязать локацию от события, достаточно в нужную системную переменную прописать пустое значение: | Чтобы отвязать локацию от события, достаточно в нужную системную переменную прописать пустое значение: | ||
+ | |||
<sxh qsp> | <sxh qsp> | ||
- | $counter='' & ! отключаем локацию-счётчик | + | $counter = '' & ! отключаем локацию-счётчик |
- | $onobjsel='' & ! отключаем локацию-обработчик события "Выделение предмета" | + | $onobjsel = '' & ! отключаем локацию-обработчик события "Выделение предмета" |
</sxh> | </sxh> | ||
===== Процессы в настоящем времени ===== | ===== Процессы в настоящем времени ===== | ||
- | Если была назначена локация-счётчик, то с приблизительно равной периодичностью будет происходить вызов указанной локации-счётчика. По умолчанию локация-счётчик вызывается 2 раза в секунду, то есть каждые 500 миллисекунд — это значение можно изменять с помощью оператора ''**SETTIMER**''. | + | Если была назначена локация-счётчик, то с приблизительно равной периодичностью будет происходить вызов указанной локации-счётчика. По умолчанию локация-счётчик вызывается 2 раза в секунду, то есть каждые 500 миллисекунд — это значение можно изменять с помощью оператора **''SETTIMER''**. |
<sxh qsp> | <sxh qsp> | ||
settimer 100 & ! устанавливаем период обращения к локации-счётчику в 100 мс | settimer 100 & ! устанавливаем период обращения к локации-счётчику в 100 мс | ||
- | $counter='отсчёт_времени' & ! плеер будет вызывать локацию **отсчёт времени** примерно 10 раз в секунду | + | $counter = 'отсчёт_времени' & ! плеер будет вызывать локацию **отсчёт времени** примерно 10 раз в секунду |
</sxh> | </sxh> | ||
Строка 196: | Строка 211: | ||
Подробнее о локации-счётчике и создании игровых событий в реальном времени читайте в статье [[help:realtime|"Реальное время"]]. | Подробнее о локации-счётчике и создании игровых событий в реальном времени читайте в статье [[help:realtime|"Реальное время"]]. | ||
- | |||
- | |||
- | ---- | ||
[[help:variables|Вперёд: Переменные]] | [[help:variables|Вперёд: Переменные]] | ||