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

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


help:menu

Различия

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

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

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
help:menu [2023/01/03 11:26]
aleks_versus переписано
help:menu [2024/12/01 10:39] (текущий)
aleks_versus
Строка 1: Строка 1:
- 
 [[help:​dynamical|Назад:​ Динамический код]] [[help:​dynamical|Назад:​ Динамический код]]
  
 ====== Меню ====== ====== Меню ======
- 
  
 **QSP** позволяет в любом месте игры вызывать всплывающее меню. Такое меню удобно для расширения функционала различных частей игры. Например,​ (и это самый распространённый случай),​ всплывающее меню позволяет "​привязать"​ различные стандартные действия к предметам. **QSP** позволяет в любом месте игры вызывать всплывающее меню. Такое меню удобно для расширения функционала различных частей игры. Например,​ (и это самый распространённый случай),​ всплывающее меню позволяет "​привязать"​ различные стандартные действия к предметам.
Строка 11: Строка 9:
 ===== Оператор MENU ===== ===== Оператор MENU =====
  
-''​**MENU** [$имя_масива]''​ - вызов "​всплывающего"​ меню из массива с именем ''​[$имя_массива]''​.+''​%%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 qsp>
 "​название пункта меню:​название локации:​путь к файлу иконки"​ "​название пункта меню:​название локации:​путь к файлу иконки"​
 </​sxh>​ </​sxh>​
- * Название пункта меню — это то, что мы увидим на экране,​ когда меню будет выведено;​ + 
- * название локации — это название локации-обработчика пункта меню, код которой будет выполняться при щелчке на соответствующем пункте меню; +  ​* Название пункта меню — это то, что мы увидим на экране,​ когда меню будет выведено;​ 
- * путь к файлу иконки — это путь к файлу изображения,​ которое будет выведено рядом с названием пункта меню.+  * название локации — это название локации-обработчика пункта меню, код которой будет выполняться при щелчке на соответствующем пункте меню; 
 +  * путь к файлу иконки — это путь к файлу изображения,​ которое будет выведено рядом с названием пункта меню. Если путь к файлу иконки не указан или указанный файл недоступен,​ то пункт меню отобразится без иконки.
  
 Таким образом мы должны заполнить массив для того, чтоб создать наши пункты меню: Таким образом мы должны заполнить массив для того, чтоб создать наши пункты меню:
 +
 <sxh qsp> <sxh qsp>
 $stone[0]='​Взять камень:​takestone'​ $stone[0]='​Взять камень:​takestone'​
Строка 30: Строка 114:
 </​sxh>​ </​sxh>​
  
-Здесь название массива (''​**$stone**''​) - это название меню, а текстовые значения массива - действия,​ для которых указаны названия пунктов и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "​Взять камень"​ произойдёт вызов локации с названием "​takestone"​. Аналогично будет происходить с другими пунктами.+Здесь название массива (''​%%$stone%%''​) - это название меню, а текстовые значения массива - действия,​ для которых указаны названия пунктов и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "​Взять камень"​ произойдёт вызов локации с названием "​takestone"​. Аналогично будет происходить с другими пунктами. 
 + 
 +Чтобы вывести меню на экран, нужно воспользоваться оператором ''​%%MENU%%'':​
  
-Чтобы вывести меню на экран, нужно воспользоваться оператором ''​**MENU**'':​ 
 <sxh qsp> <sxh qsp>
 menu '​$stone'​ menu '​$stone'​
Строка 44: Строка 129:
 $stone[2]='​Камень:​ осмотреть:​lookstone:'​ $stone[2]='​Камень:​ осмотреть:​lookstone:'​
 </​sxh>​ </​sxh>​
- 
-Если путь к файлу иконки не указан или указанный файл недоступен,​ то пункт меню отобразится без иконки. 
  
 Пример создания меню с иконками:​ Пример создания меню с иконками:​
 +
 <sxh qsp> <sxh qsp>
 ! нет иконки ! нет иконки
Строка 61: Строка 145:
 </​sxh>​ </​sxh>​
  
-Меню заканчивается на элементе массива со значением ''​**""​**''​ (пустая строка). Т.е. если массив меню состоит из элементов ''"​Взять"'',''"​Осмотреть"'',''""'',''"​Бросить"'',​ то 2 последних пункта не будут созданы:​+Меню заканчивается на элементе массива со значением ''​%%""​%%''​ (пустая строка). Т.е. если массив меню состоит из элементов ''​%%"​Взять"​%%'',''​%%"​Осмотреть"​%%'',''​%%""​%%'',''​%%"​Бросить"​%%'',​ то 2 последних пункта не будут созданы:​ 
 <sxh qsp> <sxh qsp>
 $usr_menu[0]='​Взять предмет:​take_item'​ & ! этот пункт мы увидим на экране $usr_menu[0]='​Взять предмет:​take_item'​ & ! этот пункт мы увидим на экране
Строка 68: Строка 153:
 $usr_menu[3]='​Положить предмет:​put_item'​ & ! этот пункт мы не увидим $usr_menu[3]='​Положить предмет:​put_item'​ & ! этот пункт мы не увидим
 </​sxh>​ </​sxh>​
-Чтобы вставить разделитель в меню, вместо соответствующего элемента массива напишите ''​**"​-:​-"​**''​. Т.е. если нужно поставить разделитель вместо 3-го элемента:​+ 
 +Чтобы вставить разделитель в меню, вместо соответствующего элемента массива напишите ''​%%"​-:​-"​%%''​. Т.е. если нужно поставить разделитель вместо 3-го элемента:​ 
 <sxh qsp> <sxh qsp>
 $usr_menu[0]='​Взять предмет:​take_item'​ $usr_menu[0]='​Взять предмет:​take_item'​
Строка 75: Строка 162:
 $usr_menu[3]='​Положить предмет:​put_item'​ $usr_menu[3]='​Положить предмет:​put_item'​
 </​sxh>​ </​sxh>​
 +
 +===== Примеры вызова меню =====
  
 Пример вызова меню из гиперсылки:​ Пример вызова меню из гиперсылки:​
 +
 <sxh qsp> <sxh qsp>
- '<a href="​EXEC:​ menu ''​$stone''">​Камень</​a>'​+  ​'<a href="​EXEC:​ menu ''​$stone''">​Камень</​a>'​
 </​sxh>​ </​sxh>​
 +
 +===== F.A.Q. по созданию меню =====
  
 Более подробно о том, как делать меню, можно почитать в соответствующих статьях нашего F.A.Q: Более подробно о том, как делать меню, можно почитать в соответствующих статьях нашего F.A.Q:
- * [[https://​aleksversus.github.io/​howdo_faq/​pages/kak_sdelat__menju_predmeta_0019.html|Как сделать меню предмета?​]] + 
- * [[https://​aleksversus.github.io/​howdo_faq/​pages/kak_sdelat__raznye_menju_0020.html|Как сделать разные меню?​]] +  ​* [[https://​aleksversus.github.io/​howdo_faq/​docs/howdo/​contents/​menu/​menu_of_item|Как сделать меню предмета?​]] 
- * [[https://​aleksversus.github.io/​howdo_faq/​pages/kak_sdelat__menju_v_ssylkah_0021.html|Как сделать меню в ссылках?​]] +  * [[https://​aleksversus.github.io/​howdo_faq/​docs/howdo/​contents/​menu/​different_menus|Как сделать разные меню?​]] 
- * [[https://​aleksversus.github.io/​howdo_faq/​pages/kak_peredavat__lokatsijam-punktam_menju_argumenty_0022.html|Как передавать локациям-пунктам меню аргументы?​]] +  * [[https://​aleksversus.github.io/​howdo_faq/​docs/howdo/​contents/​menu/​menu_in_hyperlinks|Как сделать меню в ссылках?​]] 
- * [[https://​aleksversus.github.io/​howdo_faq/​pages/kak_delat__kontekstnoe_menju_0023.html|Как делать контекстное меню?​]] +  * [[https://​aleksversus.github.io/​howdo_faq/​docs/howdo/​contents/​menu/​args_to_menu_item|Как передавать локациям-пунктам меню аргументы?​]] 
- * [[https://​aleksversus.github.io/​howdo_faq/​pages/kak_vstavit__razdelitel__0024.html|Как вставлять разделители?​]] +  * [[https://​aleksversus.github.io/​howdo_faq/​docs/howdo/​contents/​menu/​context_menu|Как делать контекстное меню?​]] 
- * [[https://​aleksversus.github.io/​howdo_faq/​pages/kak_vstavit__kartinki_v_menju_0025.html|Как вставлять картинки в меню?]]+  * [[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 =====
  
-Когда плеер встречает оператор ''​**MENU**''​ в коде, он выводит на экран всплывающее меню, сформированное на основе указанного массива,​ и прерывет выполнение кода, ожидая действий игрока.+Когда плеер встречает оператор ''​%%MENU%%''​ в коде, он выводит на экран всплывающее меню, сформированное на основе указанного массива,​ и прерывает выполнение кода, ожидая действий игрока.
  
 Пока ни один из пунктов меню не выбран,​ или пока игрок не щёлкнул в области за пределами меню, дальнейший код не выполняется. Пока ни один из пунктов меню не выбран,​ или пока игрок не щёлкнул в области за пределами меню, дальнейший код не выполняется.
  
-Если игрок щёлкнул по одному из пунктов меню, вызывается локация,​ соответствующая данному пункту меню. Эта локация назвается локцией-обработчиком выбранного пункта меню. При этом вызов локации осуществляется так же, как осуществлялся бы при вызове этой локации с помощью оператора ''​**[[help:​organizing|GOSUB]]**''​.+Если игрок щёлкнул по одному из пунктов меню, вызывается локация,​ соответствующая данному пункту меню. Эта локация называется локацией-обработчиком выбранного пункта меню. При этом вызов локации осуществляется так же, как осуществлялся бы при вызове этой локации с помощью оператора ''​%%GOSUB%%''​.
  
-После вызова локации продолжается выполнение кода со следующей команды после ''​**MENU**''​.+После вызова локации продолжается выполнение кода со следующей команды после ''​%%MENU%%''​.
  
-В локацию-обработчик выбранного пункта меню передаётся аргумент ​позиция выбранного пункта. Этот аргумент можно ​получить из ''​ARGS[0]''​. Позиции пунктов меню нумеруются с 1.+Если игрок ​не выбрал ни одного пункта меню ​и щёлкнул ​по области вне ​меню, просто продолжается выполнение кода со следующей ​команды после ''​%%MENU%%''​.
  
-Если игрок ​не выбрал ни одного пункта меню ​и щёлкнул ​по области вне меню, просто продолжается выполнение кода со следующей ​команды после ''​**MENU**''​.+В локацию-обработчик выбранного пункта меню передаётся один аргумент ​позиция выбранного пункта. Этот аргумент можно ​получить из ''​%%ARGS[0]%%''​. Позиции пунктов меню нумеруются с 1.
  
-[[help:​sound|Вперёд: Звук]]+Так же в локацию обработчик ​передаются значения локальных переменных,​ объявленные до вызова меню с помощью оператора ''​%%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/menu.1672745167.txt.gz · Последние изменения: 2023/01/03 11:26 — aleks_versus