[[help:dynamical|Назад: Динамический код]]
====== Меню ======
**QSP** позволяет в любом месте игры вызывать всплывающее меню. Такое меню удобно для расширения функционала различных частей игры. Например, (и это самый распространённый случай), всплывающее меню позволяет "привязать" различные стандартные действия к предметам.
Меню можно вызвать в ЛЮБОМ МЕСТЕ игры. Т.е. нет никакого технического запрета, чтобы вызвать меню прямо из кода локации, или из действия, или из кода гиперссылки. Оператор используется один и тот же.
===== Оператор MENU =====
''%%MENU [$имя_масива]%%'' - вызов "всплывающего" меню из массива с именем ''%%[$имя_массива]%%''.
Прежде, чем использовать данный оператор, необходимо заполнить массив, на основе содержимого которого будут формироваться пункты меню. Начиная с плеера версии 5.9.0 у нас есть два варианта, как заполнять этот массив.
==== Первый вариант заполнения массива меню. Кортежи ====
Этот вариант можно использовать, начиная с плееров версии 5.9.0. В более старых версиях он не работает.
Здесь каждый пункт меню это кортеж из трёх значений:
["название пункта меню", "название локации", "путь к файлу иконки"]
* Название пункта меню — это то, что мы увидим на экране, когда меню будет выведено;
* название локации — это название локации-обработчика пункта меню, код которой будет выполняться при щелчке на соответствующем пункте меню;
* путь к файлу иконки — это путь к файлу изображения, которое будет выведено рядом с названием пункта меню. Если путь к файлу иконки не указан или указанный файл недоступен, то пункт меню отобразится без иконки.
Таким образом мы должны заполнить массив кортежей для того, чтоб создать наши пункты меню:
%stone[0] = ['Взять камень','takestone']
%stone[1] = ['Кинуть камень','throwstone']
%stone[2] = ['Осмотреть камень','lookstone']
Здесь название массива (''%%%stone%%'') - это название меню, а кортежи - действия, для которых указаны названия пунктов и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "Взять камень" произойдёт вызов локации с названием "takestone". Аналогично будет происходить с другими пунктами.
Чтобы вывести меню на экран, нужно воспользоваться оператором ''%%MENU%%'':
menu '%stone'
Пример создания меню с иконками:
! нет иконки
%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-х пунктов
Меню заканчивается на элементе массива со пустым кортежем, либо с кортежем, в котором отсутствует значение для названия пункта меню или локации-обработчика пункта меню.
Примеры, когда два последних пункта меню не будут созданы:
%usr_menu[0]=['Взять предмет','take_item'] & ! этот пункт мы увидим на экране
%usr_menu[1]=['Осмотреть предмет','look_item'] & ! и этот пункт мы увидим на экране
%usr_menu[2]=[] & ! пустой кортеж, плеер посчитает, что меню кончилось
%usr_menu[3]=['Положить предмет','put_item'] & ! этот пункт мы не увидим
%usr_menu[0]=['Взять предмет','take_item'] & ! этот пункт мы увидим на экране
%usr_menu[1]=['Осмотреть предмет','look_item'] & ! и этот пункт мы увидим на экране
%usr_menu[2]=['уничтожить предмет', ''] & ! не указана локация-обработчик, пункт не увидим
%usr_menu[3]=['Положить предмет','put_item'] & ! и этот пункт мы не увидим
%usr_menu[0]=['Взять предмет','take_item'] & ! этот пункт мы увидим на экране
%usr_menu[1]=['Осмотреть предмет','look_item'] & ! и этот пункт мы увидим на экране
%usr_menu[2]=['', 'del_item'] & ! не указано название, пункт не увидим
%usr_menu[3]=['Положить предмет','put_item'] & ! и этот пункт мы не увидим
Чтобы вставить разделитель в меню, используйте кортеж со значениями ''%%-%%''. Т.е. если нужно поставить разделитель вместо 3-го элемента:
%usr_menu[0]=['Взять предмет','take_item']
%usr_menu[1]=['Осмотреть предмет','look_item']
%usr_menu[2]=['-', '-'] & ! разделитель вместо пункта меню
%usr_menu[3]=['Положить предмет','put_item']
==== Второй вариант заполнения массива меню. Строки ====
Этот вариант можно использовать, как в плеерах версии 5.9.0, так и в более ранних версиях.
Здесь пункты меню — это строковые значения массива с особым форматом записи:
"название пункта меню:название локации:путь к файлу иконки"
* Название пункта меню — это то, что мы увидим на экране, когда меню будет выведено;
* название локации — это название локации-обработчика пункта меню, код которой будет выполняться при щелчке на соответствующем пункте меню;
* путь к файлу иконки — это путь к файлу изображения, которое будет выведено рядом с названием пункта меню. Если путь к файлу иконки не указан или указанный файл недоступен, то пункт меню отобразится без иконки.
Таким образом мы должны заполнить массив для того, чтоб создать наши пункты меню:
$stone[0]='Взять камень:takestone'
$stone[1]='Кинуть камень:throwstone'
$stone[2]='Осмотреть камень:lookstone'
Здесь название массива (''%%$stone%%'') - это название меню, а текстовые значения массива - действия, для которых указаны названия пунктов и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "Взять камень" произойдёт вызов локации с названием "takestone". Аналогично будет происходить с другими пунктами.
Чтобы вывести меню на экран, нужно воспользоваться оператором ''%%MENU%%'':
menu '$stone'
Поиск символов ":" в пунктах начинается с конца строки, то есть название пункта меню может содержать двоеточия, однако тогда обязательно после названия локации должно стоять двоеточие, даже если вы не используете иконки для пунктов меню.
$stone[0]='Камень: взять:takestone:'
$stone[1]='Камень: кинуть:throwstone:'
$stone[2]='Камень: осмотреть:lookstone:'
Пример создания меню с иконками:
! нет иконки
$usr_menu[0] = 'Взять предмет:take_item'
! иконка задана gif-файлом
$usr_menu[1] = 'Положить предмет:put_item:images/put_item.gif'
! иконка задана значением $icon_file
$usr_menu[2] = 'Осмотреть предмет:look_item:<<$icon_file>>'
! пункт меню задан 3-мя переменными
$usr_menu[3] = '<<$name>>:<<$location>>:<<$file>>'
menu 'usr_menu' &! покажет меню из 4-х пунктов
Меню заканчивается на элементе массива со значением ''%%""%%'' (пустая строка). Т.е. если массив меню состоит из элементов ''%%"Взять"%%'',''%%"Осмотреть"%%'',''%%""%%'',''%%"Бросить"%%'', то 2 последних пункта не будут созданы:
$usr_menu[0]='Взять предмет:take_item' & ! этот пункт мы увидим на экране
$usr_menu[1]='Осмотреть предмет:look_item' & ! и этот пункт мы увидим на экране
$usr_menu[2]='' & ! здесь пустое значение, плеер посчитает, что меню кончилось
$usr_menu[3]='Положить предмет:put_item' & ! этот пункт мы не увидим
Чтобы вставить разделитель в меню, вместо соответствующего элемента массива напишите ''%%"-:-"%%''. Т.е. если нужно поставить разделитель вместо 3-го элемента:
$usr_menu[0]='Взять предмет:take_item'
$usr_menu[1]='Осмотреть предмет:look_item'
$usr_menu[2]='-:-'
$usr_menu[3]='Положить предмет:put_item'
===== Примеры вызова меню =====
Пример вызова меню из гиперсылки:
'Камень'
===== 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%%''. Пример:
# start
i = 99
act 'run':
local i = 137
%stone = ['click', 'mp']
menu '%stone'
end
-
# mp
*pl i
-
Если запустить игру с представленным выше кодом и щёлкнуть на действии "run", на экране появится меню с одним пунктом "click". Если игрок щёлкнет по этому пункту, на экране отобразиться значение 137, присвоенное локальной переменной внутри действия. То есть значение локальной переменной, объявленной в действии, будет доступно и в локации-обработчике пункта меню, вызванного из кода этого действия.
[[help:sound|Вперёд: Звук]]