Инструменты пользователя

Инструменты сайта


help:menu

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следущая версия
Предыдущая версия
help:menu [2013/11/07 12:21]
newsash создано
help:menu [2024/12/01 10:39] (текущий)
aleks_versus
Строка 1: Строка 1:
-[[help:objs|Назад: ​Предметы (инвентарь)]] +[[help:dynamical|Назад: ​Динамический код]]
-=====Меню=====+
  
-MENU [$выражение] - вызов меню ​с заданным названием (см. раздел "​Создание меню для предметов"​).+====== Меню ​======
  
 +**QSP** позволяет в любом месте игры вызывать всплывающее меню. Такое меню удобно для расширения функционала различных частей игры. Например,​ (и это самый распространённый случай),​ всплывающее меню позволяет "​привязать"​ различные стандартные действия к предметам.
  
-Меню ​набор строковых значений массива, формат записи которых: [$названиеазвание локации:путь к файлу ​иконки].+Меню ​можно вызвать в ЛЮБОМ МЕСТЕ игры. Т.е. нет ​никакого технического запрета, чтобы вызвать меню прямо ​из кода ​локации, или из действия, или из кода гиперссылки. Оператор используется один и тот же.
  
-Поиск символов ":"​ начинается с конца строки, то есть название пункта меню может содержать двоеточия.+===== Оператор ​MENU =====
  
-Если путь к файлу ​иконки не указан или указанный файл недоступен,​ то пункт ​меню ​отобразится без иконки.+''​%%MENU [$имя_масива]%%''​ - вызов "​всплывающего" ​меню ​из массива с именем ''​%%[$имя_массива]%%''​.
  
-Пример создания меню:+Прежде, чем использовать ​данный оператор,​ необходимо заполнить массив,​ на основе содержимого которого будут формироваться пункты ​меню. Начиная с плеера версии 5.9.0 у нас есть два варианта,​ как заполнять этот массив.
  
 +==== Первый вариант заполнения массива меню. Кортежи ====
  
 +Этот вариант можно использовать,​ начиная с плееров версии 5.9.0. В более старых версиях он не работает.
  
-$stone[0]='​Взять камень:takestone'​+Здесь каждый пункт ​меню это кортеж из трёх значений:
  
-$stone[1]='​Кинуть камень:​throwstone'​+<sxh qsp> 
 +["название пункта меню", "​название локации",​ "​путь к файлу иконки"​] 
 +</​sxh>​
  
-$stone[2]='​Осмотреть камень:' + $see_stone+  * Название пункта ​меню — это то, что мы увидим на экране, когда меню будет выведено;​ 
 +  * название локации — это название локации-обработчика пункта меню, код которой будет выполняться при щелчке на соответствующем пункте ​меню; 
 +  * путь к файлу иконки — это путь к файлу изображения,​ которое будет выведено рядом с названием пункта меню. Если путь к файлу иконки не указан или указанный файл недоступен,​ то пункт меню отобразится без иконки.
  
 +Таким образом мы должны заполнить массив кортежей для того, чтоб создать наши пункты меню:
  
 +<sxh qsp>
 +%stone[0] = ['​Взять камень','​takestone'​]
 +%stone[1] = ['​Кинуть камень','​throwstone'​]
 +%stone[2] = ['​Осмотреть камень','​lookstone'​]
 +</​sxh>​
  
-Здесь название массива ("stone") - это название меню, а текстовые значения массива ​- действия,​ для которых указаны названия и названия локаций-обработчиков выбора пунктов меню. ​Т.е. при выборе пункта "​Взять камень"​ произойдёт обработка ​локации с названием "​takestone"​. Аналогично будет происходить с другими пунктами.+Здесь название массива (''​%%%stone%%''​) - это название меню, а кортежи - действия,​ для которых указаны названия ​пунктов ​и названия локаций-обработчиков выбора пунктов меню. ​При выборе пункта "​Взять камень"​ произойдёт ​вызов локации с названием "​takestone"​. Аналогично будет происходить с другими пунктами.
  
-В локацию-обработчик ​выбора пункта меню ​передаётся аргумент (ARGS[0]) - позиция ​выбранного пункта. Позиции элементов меню индексируются с 1.+Чтобы вывести меню ​на экран, нужно воспользоваться ​оператором ''​%%MENU%%'':​
  
-Вызов меню производится с помощью оператора "​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 'stone'+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>​
  
-menu '$stone'+Чтобы вставить разделитель в меню, используйте кортеж со значениями ​''​%%-%%''​. Т.е. если нужно поставить разделитель вместо 3-го элемента:​
  
 +<sxh qsp>
 +%usr_menu[0]=['​Взять предмет','​take_item'​]
 +%usr_menu[1]=['​Осмотреть предмет','​look_item'​]
 +%usr_menu[2]=['​-',​ '​-'​] & ! разделитель вместо пункта меню
 +%usr_menu[3]=['​Положить предмет','​put_item'​]
 +</​sxh>​
  
 +==== Второй вариант заполнения массива меню. Строки ====
  
-Этот оператор покажет меню с названием "​stone"​.+Этот ​вариант можно использовать,​ как в плеерах версии 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> 
 +$stone[0]='​Камень:​ взять:​takestone:'​ 
 +$stone[1]='​Камень:​ кинуть:​throwstone:'​ 
 +$stone[2]='​Камень:​ осмотреть:​lookstone:'​ 
 +</​sxh>​
  
 Пример создания меню с иконками:​ Пример создания меню с иконками:​
  
 +<sxh qsp>
 +! нет иконки
 +$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-х пунктов
 +</​sxh>​
 +
 +Меню заканчивается на элементе массива со значением ''​%%""​%%''​ (пустая строка). Т.е. если массив меню состоит из элементов ''​%%"​Взять"​%%'',''​%%"​Осмотреть"​%%'',''​%%""​%%'',''​%%"​Бросить"​%%'',​ то 2 последних пункта не будут созданы:​
 +
 +<sxh qsp>
 +$usr_menu[0]='​Взять предмет:​take_item'​ & ! этот пункт мы увидим на экране
 +$usr_menu[1]='​Осмотреть предмет:​look_item'​ & ! и этот пункт мы увидим на экране
 +$usr_menu[2]=''​ & ! здесь пустое значение,​ плеер посчитает,​ что меню кончилось
 +$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>​
 +
 +===== Примеры вызова меню =====
 +
 +Пример вызова меню из гиперсылки:​
 +
 +<sxh qsp>
 +  '<a href="​EXEC:​ menu ''​$stone''">​Камень</​a>'​
 +</​sxh>​
 +
 +===== F.A.Q. по созданию меню =====
  
 +Более подробно о том, как делать меню, можно почитать в соответствующих статьях нашего F.A.Q:
  
-$usr_menu[0= 'Взять предмет:​take_item'​ & ! нет иконки+  * [[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|Как вставлять картинки ​в меню?]]
  
-$usr_menu[1] ​'Положить предмет:​put_item:​images/​put_item.gif'​ & ! иконка задана gif-файлом+===== Порядок ​работы оператора MENU =====
  
-$usr_menu[2] = '​Осмотреть предмет:​look_item:<<​$icon_file>>​' ​& ! иконка ​задана значением $icon_file+Когда плеер встречает оператор ''​%%MENU%%''​ в коде, ​он выводит на экран всплывающее меню, сформированное ​на основе указанного массива, и прерывает выполнение ​кода, ожидая действий игрока.
  
-$usr_menu[3] = '<<​$name>>:<<​$loc>>:<<​$file>>'​ & ! пункт меню ​задан 3-мя ​переменными+Пока ни один из пунктов меню ​не выбран, или ​пока игрок не щёлкнул в области за пределами ​меню, дальнейший код не выполняется.
  
-menu '​usr_menu'​ - покажет меню из 4-х пунктов+Если игрок щёлкнул ​по одному из пунктов меню, вызывается локация,​ соответствующая данному пункту ​меню. Эта локация называется локацией-обработчиком выбранного ​пункта меню. При этом вызов локации осуществляется так же, как осуществлялся бы при вызове этой локации с помощью оператора ''​%%GOSUB%%''​.
  
 +После вызова локации продолжается выполнение кода со следующей команды после ''​%%MENU%%''​.
  
 +Если игрок не выбрал ни одного пункта меню и щёлкнул по области вне меню, просто продолжается выполнение кода со следующей команды после ''​%%MENU%%''​.
  
-PS:+В локацию-обработчик выбранного пункта меню передаётся один аргумент - позиция выбранного пункта. Этот аргумент можно получить из ''​%%ARGS[0]%%''​. Позиции пунктов меню нумеруются с 1.
  
-1) Меню заканчивается на элементе массива со значением %%''​%% (пустая строка). Т.еесли массив ​меню состоит из элементов зять','​Осмотреть',%%''​%%,'Бросить', то 2 последних пункта ​меню не будут созданы.+Так же в локацию обработчик передаются значения ​локальных переменных, ​объявленные до вызова меню ​с помощью оператора ''%%MENU%%''​. Точно так же, как ​для ''​%%GOSUB%%''​. Пример:
  
-2) Чтобы вставить разделитель в менювместо соответствующего элемента массива напишите "-:-". Т.е. если нужно поставить разделитель вместо 2-го элемента меню "​stone":​+<sxh qsp> 
 +# start 
 +i = 99 
 +act '​run':​ 
 +    local i = 137 
 +    %stone = ['​click'​'​mp'​] 
 +    menu '​%stone'​ 
 +end 
 +-
  
 +# mp
 +*pl i
 +-
 +</​sxh>​
  
 +Если запустить игру с представленным выше кодом и щёлкнуть на действии "​run",​ на экране появится меню с одним пунктом "​click"​. Если игрок щёлкнет по этому пункту,​ на экране отобразиться значение 137, присвоенное локальной переменной внутри действия. То есть значение локальной переменной,​ объявленной в действии,​ будет доступно и в локации-обработчике пункта меню, вызванного из кода этого действия.
  
-$stone[1]='-:-'+[[help:sound|Вперёд:​ Звук]]
  
help/menu.1383826862.txt.gz · Последние изменения: 2013/11/07 16:21 (внешнее изменение)