Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:menu [2013/11/07 12:32] newsash |
help:menu [2024/12/01 10:39] (текущий) aleks_versus |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | [[help:objs|Назад: Предметы (инвентарь)]] | + | [[help:dynamical|Назад: Динамический код]] |
- | =====Меню===== | + | |
- | * **MENU** //[$имя]// - вызов меню из массива с именем //[$имя]// | + | ====== Меню ====== |
- | Меню - набор строковых значений массива, формат записи которых:\\ | + | **QSP** позволяет в любом месте игры вызывать всплывающее меню. Такое меню удобно для расширения функционала различных частей игры. Например, (и это самый распространённый случай), всплывающее меню позволяет "привязать" различные стандартные действия к предметам. |
- | //$название//**:**//название локации//**:**//путь к файлу иконки// | + | |
- | Поиск символов ":" начинается с конца строки, то есть название пункта меню может содержать двоеточия. | + | Меню можно вызвать в ЛЮБОМ МЕСТЕ игры. Т.е. нет никакого технического запрета, чтобы вызвать меню прямо из кода локации, или из действия, или из кода гиперссылки. Оператор используется один и тот же. |
- | Если путь к файлу иконки не указан или указанный файл недоступен, то пункт меню отобразится без иконки. | + | ===== Оператор MENU ===== |
- | Пример создания меню:<sxh qsp> | + | ''%%MENU [$имя_масива]%%'' - вызов "всплывающего" меню из массива с именем ''%%[$имя_массива]%%''. |
+ | |||
+ | Прежде, чем использовать данный оператор, необходимо заполнить массив, на основе содержимого которого будут формироваться пункты меню. Начиная с плеера версии 5.9.0 у нас есть два варианта, как заполнять этот массив. | ||
+ | |||
+ | ==== Первый вариант заполнения массива меню. Кортежи ==== | ||
+ | |||
+ | Этот вариант можно использовать, начиная с плееров версии 5.9.0. В более старых версиях он не работает. | ||
+ | |||
+ | Здесь каждый пункт меню это кортеж из трёх значений: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ["название пункта меню", "название локации", "путь к файлу иконки"] | ||
+ | </sxh> | ||
+ | |||
+ | * Название пункта меню — это то, что мы увидим на экране, когда меню будет выведено; | ||
+ | * название локации — это название локации-обработчика пункта меню, код которой будет выполняться при щелчке на соответствующем пункте меню; | ||
+ | * путь к файлу иконки — это путь к файлу изображения, которое будет выведено рядом с названием пункта меню. Если путь к файлу иконки не указан или указанный файл недоступен, то пункт меню отобразится без иконки. | ||
+ | |||
+ | Таким образом мы должны заполнить массив кортежей для того, чтоб создать наши пункты меню: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %stone[0] = ['Взять камень','takestone'] | ||
+ | %stone[1] = ['Кинуть камень','throwstone'] | ||
+ | %stone[2] = ['Осмотреть камень','lookstone'] | ||
+ | </sxh> | ||
+ | |||
+ | Здесь название массива (''%%%stone%%'') - это название меню, а кортежи - действия, для которых указаны названия пунктов и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "Взять камень" произойдёт вызов локации с названием "takestone". Аналогично будет происходить с другими пунктами. | ||
+ | |||
+ | Чтобы вывести меню на экран, нужно воспользоваться оператором ''%%MENU%%'': | ||
+ | |||
+ | <sxh qsp> | ||
+ | menu '%stone' | ||
+ | </sxh> | ||
+ | |||
+ | Пример создания меню с иконками: | ||
+ | |||
+ | <sxh qsp> | ||
+ | ! нет иконки | ||
+ | %usr_menu[0] = ['Взять предмет:take_item'] | ||
+ | ! иконка задана gif-файлом | ||
+ | %usr_menu[1] = ['Положить предмет:put_item:images/put_item.gif'] | ||
+ | ! иконка задана значением $icon_file | ||
+ | %usr_menu[2] = ['Уничтожить предмет','del_item', $icon_file] | ||
+ | ! пункт меню задан 3-мя переменными | ||
+ | %usr_menu[3] = [$name, $location, $icon_file] | ||
+ | |||
+ | menu 'usr_menu' &! покажет меню из 4-х пунктов | ||
+ | </sxh> | ||
+ | |||
+ | Меню заканчивается на элементе массива со пустым кортежем, либо с кортежем, в котором отсутствует значение для названия пункта меню или локации-обработчика пункта меню. | ||
+ | |||
+ | Примеры, когда два последних пункта меню не будут созданы: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %usr_menu[0]=['Взять предмет','take_item'] & ! этот пункт мы увидим на экране | ||
+ | %usr_menu[1]=['Осмотреть предмет','look_item'] & ! и этот пункт мы увидим на экране | ||
+ | %usr_menu[2]=[] & ! пустой кортеж, плеер посчитает, что меню кончилось | ||
+ | %usr_menu[3]=['Положить предмет','put_item'] & ! этот пункт мы не увидим | ||
+ | </sxh> | ||
+ | |||
+ | <sxh qsp> | ||
+ | %usr_menu[0]=['Взять предмет','take_item'] & ! этот пункт мы увидим на экране | ||
+ | %usr_menu[1]=['Осмотреть предмет','look_item'] & ! и этот пункт мы увидим на экране | ||
+ | %usr_menu[2]=['уничтожить предмет', ''] & ! не указана локация-обработчик, пункт не увидим | ||
+ | %usr_menu[3]=['Положить предмет','put_item'] & ! и этот пункт мы не увидим | ||
+ | </sxh> | ||
+ | |||
+ | <sxh qsp> | ||
+ | %usr_menu[0]=['Взять предмет','take_item'] & ! этот пункт мы увидим на экране | ||
+ | %usr_menu[1]=['Осмотреть предмет','look_item'] & ! и этот пункт мы увидим на экране | ||
+ | %usr_menu[2]=['', 'del_item'] & ! не указано название, пункт не увидим | ||
+ | %usr_menu[3]=['Положить предмет','put_item'] & ! и этот пункт мы не увидим | ||
+ | </sxh> | ||
+ | |||
+ | Чтобы вставить разделитель в меню, используйте кортеж со значениями ''%%-%%''. Т.е. если нужно поставить разделитель вместо 3-го элемента: | ||
+ | |||
+ | <sxh qsp> | ||
+ | %usr_menu[0]=['Взять предмет','take_item'] | ||
+ | %usr_menu[1]=['Осмотреть предмет','look_item'] | ||
+ | %usr_menu[2]=['-', '-'] & ! разделитель вместо пункта меню | ||
+ | %usr_menu[3]=['Положить предмет','put_item'] | ||
+ | </sxh> | ||
+ | |||
+ | ==== Второй вариант заполнения массива меню. Строки ==== | ||
+ | |||
+ | Этот вариант можно использовать, как в плеерах версии 5.9.0, так и в более ранних версиях. | ||
+ | |||
+ | Здесь пункты меню — это строковые значения массива с особым форматом записи: | ||
+ | |||
+ | <sxh qsp> | ||
+ | "название пункта меню:название локации:путь к файлу иконки" | ||
+ | </sxh> | ||
+ | |||
+ | * Название пункта меню — это то, что мы увидим на экране, когда меню будет выведено; | ||
+ | * название локации — это название локации-обработчика пункта меню, код которой будет выполняться при щелчке на соответствующем пункте меню; | ||
+ | * путь к файлу иконки — это путь к файлу изображения, которое будет выведено рядом с названием пункта меню. Если путь к файлу иконки не указан или указанный файл недоступен, то пункт меню отобразится без иконки. | ||
+ | |||
+ | Таким образом мы должны заполнить массив для того, чтоб создать наши пункты меню: | ||
+ | |||
+ | <sxh qsp> | ||
$stone[0]='Взять камень:takestone' | $stone[0]='Взять камень:takestone' | ||
$stone[1]='Кинуть камень:throwstone' | $stone[1]='Кинуть камень:throwstone' | ||
- | $stone[2]='Осмотреть камень:' + $see_stone | + | $stone[2]='Осмотреть камень:lookstone' |
</sxh> | </sxh> | ||
- | Здесь название массива ("stone") - это название меню, а текстовые значения массива - действия, для которых указаны названия и названия локаций-обработчиков выбора пунктов меню. Т.е. при выборе пункта "Взять камень" произойдёт обработка локации с названием "takestone". Аналогично будет происходить с другими пунктами. | + | Здесь название массива (''%%$stone%%'') - это название меню, а текстовые значения массива - действия, для которых указаны названия пунктов и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "Взять камень" произойдёт вызов локации с названием "takestone". Аналогично будет происходить с другими пунктами. |
- | В локацию-обработчик выбора пункта меню передаётся аргумент (ARGS[0]) - позиция выбранного пункта. Позиции элементов меню индексируются с 1. | + | Чтобы вывести меню на экран, нужно воспользоваться оператором ''%%MENU%%'': |
- | Вызов меню производится с помощью оператора "MENU" из любого места кода игры. Пример: <sxh qsp> | + | <sxh qsp> |
- | menu 'stone' | + | |
- | !или | + | |
menu '$stone' | menu '$stone' | ||
</sxh> | </sxh> | ||
- | Этот оператор покажет меню с названием "stone". | ||
- | Пример создания меню с иконками:<sxh qsp> | + | Поиск символов ":" в пунктах начинается с конца строки, то есть название пункта меню может содержать двоеточия, однако тогда обязательно после названия локации должно стоять двоеточие, даже если вы не используете иконки для пунктов меню. |
+ | |||
+ | <sxh qsp> | ||
+ | $stone[0]='Камень: взять:takestone:' | ||
+ | $stone[1]='Камень: кинуть:throwstone:' | ||
+ | $stone[2]='Камень: осмотреть:lookstone:' | ||
+ | </sxh> | ||
+ | |||
+ | Пример создания меню с иконками: | ||
+ | |||
+ | <sxh qsp> | ||
! нет иконки | ! нет иконки | ||
$usr_menu[0] = 'Взять предмет:take_item' | $usr_menu[0] = 'Взять предмет:take_item' | ||
Строка 36: | Строка 140: | ||
$usr_menu[2] = 'Осмотреть предмет:look_item:<<$icon_file>>' | $usr_menu[2] = 'Осмотреть предмет:look_item:<<$icon_file>>' | ||
! пункт меню задан 3-мя переменными | ! пункт меню задан 3-мя переменными | ||
- | $usr_menu[3] = '<<$name>>:<<$loc>>:<<$file>>' | + | $usr_menu[3] = '<<$name>>:<<$location>>:<<$file>>' |
menu 'usr_menu' &! покажет меню из 4-х пунктов | menu 'usr_menu' &! покажет меню из 4-х пунктов | ||
</sxh> | </sxh> | ||
+ | Меню заканчивается на элементе массива со значением ''%%""%%'' (пустая строка). Т.е. если массив меню состоит из элементов ''%%"Взять"%%'',''%%"Осмотреть"%%'',''%%""%%'',''%%"Бросить"%%'', то 2 последних пункта не будут созданы: | ||
- | PS: | + | <sxh qsp> |
+ | $usr_menu[0]='Взять предмет:take_item' & ! этот пункт мы увидим на экране | ||
+ | $usr_menu[1]='Осмотреть предмет:look_item' & ! и этот пункт мы увидим на экране | ||
+ | $usr_menu[2]='' & ! здесь пустое значение, плеер посчитает, что меню кончилось | ||
+ | $usr_menu[3]='Положить предмет:put_item' & ! этот пункт мы не увидим | ||
+ | </sxh> | ||
- | 1) Меню заканчивается на элементе массива со значением %%''%% (пустая строка). Т.е. если массив меню состоит из элементов 'Взять','Осмотреть',%%''%%,'Бросить', то 2 последних пункта меню не будут созданы. | + | Чтобы вставить разделитель в меню, вместо соответствующего элемента массива напишите ''%%"-:-"%%''. Т.е. если нужно поставить разделитель вместо 3-го элемента: |
- | 2) Чтобы вставить разделитель в меню, вместо соответствующего элемента массива напишите "-:-". Т.е. если нужно поставить разделитель вместо 2-го элемента меню "stone": | + | <sxh qsp> |
+ | $usr_menu[0]='Взять предмет:take_item' | ||
+ | $usr_menu[1]='Осмотреть предмет:look_item' | ||
+ | $usr_menu[2]='-:-' | ||
+ | $usr_menu[3]='Положить предмет:put_item' | ||
+ | </sxh> | ||
+ | ===== Примеры вызова меню ===== | ||
+ | Пример вызова меню из гиперсылки: | ||
- | $stone[1]='-:-' | + | <sxh qsp> |
+ | '<a href="EXEC: menu ''$stone''">Камень</a>' | ||
+ | </sxh> | ||
+ | |||
+ | ===== F.A.Q. по созданию меню ===== | ||
+ | |||
+ | Более подробно о том, как делать меню, можно почитать в соответствующих статьях нашего F.A.Q: | ||
+ | |||
+ | * [[https://aleksversus.github.io/howdo_faq/docs/howdo/contents/menu/menu_of_item|Как сделать меню предмета?]] | ||
+ | * [[https://aleksversus.github.io/howdo_faq/docs/howdo/contents/menu/different_menus|Как сделать разные меню?]] | ||
+ | * [[https://aleksversus.github.io/howdo_faq/docs/howdo/contents/menu/menu_in_hyperlinks|Как сделать меню в ссылках?]] | ||
+ | * [[https://aleksversus.github.io/howdo_faq/docs/howdo/contents/menu/args_to_menu_item|Как передавать локациям-пунктам меню аргументы?]] | ||
+ | * [[https://aleksversus.github.io/howdo_faq/docs/howdo/contents/menu/context_menu|Как делать контекстное меню?]] | ||
+ | * [[https://aleksversus.github.io/howdo_faq/docs/howdo/contents/menu/menu_separator|Как вставлять разделители?]] | ||
+ | * [[https://aleksversus.github.io/howdo_faq/docs/howdo/contents/menu/image_in_menu|Как вставлять картинки в меню?]] | ||
+ | |||
+ | ===== Порядок работы оператора MENU ===== | ||
+ | |||
+ | Когда плеер встречает оператор ''%%MENU%%'' в коде, он выводит на экран всплывающее меню, сформированное на основе указанного массива, и прерывает выполнение кода, ожидая действий игрока. | ||
+ | |||
+ | Пока ни один из пунктов меню не выбран, или пока игрок не щёлкнул в области за пределами меню, дальнейший код не выполняется. | ||
+ | |||
+ | Если игрок щёлкнул по одному из пунктов меню, вызывается локация, соответствующая данному пункту меню. Эта локация называется локацией-обработчиком выбранного пункта меню. При этом вызов локации осуществляется так же, как осуществлялся бы при вызове этой локации с помощью оператора ''%%GOSUB%%''. | ||
+ | |||
+ | После вызова локации продолжается выполнение кода со следующей команды после ''%%MENU%%''. | ||
+ | |||
+ | Если игрок не выбрал ни одного пункта меню и щёлкнул по области вне меню, просто продолжается выполнение кода со следующей команды после ''%%MENU%%''. | ||
+ | |||
+ | В локацию-обработчик выбранного пункта меню передаётся один аргумент - позиция выбранного пункта. Этот аргумент можно получить из ''%%ARGS[0]%%''. Позиции пунктов меню нумеруются с 1. | ||
+ | |||
+ | Так же в локацию обработчик передаются значения локальных переменных, объявленные до вызова меню с помощью оператора ''%%MENU%%''. Точно так же, как для ''%%GOSUB%%''. Пример: | ||
+ | |||
+ | <sxh qsp> | ||
+ | # start | ||
+ | i = 99 | ||
+ | act 'run': | ||
+ | local i = 137 | ||
+ | %stone = ['click', 'mp'] | ||
+ | menu '%stone' | ||
+ | end | ||
+ | - | ||
+ | |||
+ | # mp | ||
+ | *pl i | ||
+ | - | ||
+ | </sxh> | ||
+ | |||
+ | Если запустить игру с представленным выше кодом и щёлкнуть на действии "run", на экране появится меню с одним пунктом "click". Если игрок щёлкнет по этому пункту, на экране отобразиться значение 137, присвоенное локальной переменной внутри действия. То есть значение локальной переменной, объявленной в действии, будет доступно и в локации-обработчике пункта меню, вызванного из кода этого действия. | ||
- | ---- | ||
[[help:sound|Вперёд: Звук]] | [[help:sound|Вперёд: Звук]] | ||
+ |