Перейти к основному содержимому

4.4. Как передавать локациям-пунктам меню аргументы?

В: Как передавать локациям-пунктам меню аргументы? О:

При выполнении кода локации, соответствующей пункту меню, непосредственно в массив args передаётся только номер пункта.

Если у вас фиксированные меню, то Вы можете получить номер пункта из нулевой ячейки массива args и таким образом выполнение любого пункта меню можно разместить на одной локации:

%меню_отвёртка[0] = ['Осмотреть', 'screw_menu']
%меню_отвёртка[1] = ['Использовать', 'screw_menu']
%меню_отвёртка[2] = ['Выбросить', 'screw_menu']

! локация "screw_menu"
if args[0]=1:
! если передано число 1
! это пункт меню "Осмотреть"
clr
pl "Обыкновенная крестовая отвёртка. Подойдёт для регулирования громкости"
end
if args[0]=2:
! если передано число 2
! это пункт "Использовать"
громкость=громкость-50
*nl "Вы сунули отвёртку в ухо и звуки стали тише."
end
if args[0]=3:
! если передано число 3
! это пункт "Выбросить"
clr
pl "Вы выбросили отвёртку"
delobj "Отвёртка"
end

Этот вариант не будет работать, если меню формируется динамически, т.е. пункты в него добавляются или удаляются по мере прохождения игры, или в зависимости от условий. Тем не менее вы можете узнать, какой именно пункт меню вызвал данную локацию, используя простое решение, предложенное Werewolf'ом. Оно изложено ниже.

Так или иначе вам приходится помещать все пункты меню в массив1:

%menu_stone[] = ['Осмотреть', 'menu_stone']
%menu_stone[] = ['Укусить', 'menu_stone']
%menu_stone[] = ['Выбросить', 'menu_stone']

Таким образом на локации-обработчике пункта меню, используя значение в args[0], можно получить содержимое ячейки массива, относящейся к данному пункту меню:

! получаем номер ячейки массива, соответствующей данному пункту меню
! пункты меню нумеруются с 1, поэтому номер ячейки вычисляем так:
local i=args[0]-1
! а дальше проделываем то же, что и для предыдущего варианта,
! отличие заключается в том, что мы извлекаем из пункта меню его название
local $menu_desc_, %_ = %menu_stone[i]

if $menu_desc_ = 'Осмотреть':
! это пункт меню "Осмотреть"
clr
pl "Обыкновенный камень. Подойдёт для изготовления молний Индры."
end
if $menu_desc_ = 'Укусить':
! это пункт "Укусить"
*nl "Вы вонзили зубы в твёрдую плоть камня. Камень оказался прочнее."
end
if $menu_desc_ = 'Выбросить':
! это пункт "Выбросить"
clr
pl "Вы выбросили камень."
delobj "Камень"
end

Это позволяет в том числе передавать на локацию-обработчик пункта меню много большее количество данных. Если третий элемент кортежа при формировании пункта меню — это путь к файлу иконки для пункта меню, то четвёртый, пятый и т.д. — это данные, которые мы можем присовокупить к пункту меню.

! где-то формируем пункт меню с аргументами
%menu_stone[] = ['Осмотреть', 'menu_stone', 'imgs/pic.png', 'Камень №1', количество_камней]

! в локации обработчике пункта меню, извлекаем только нужные данные
local i = args[0] - 1
local data_array_
unpackarr 'data_array', %menu_stone[i], 3
local $name_, number_ = $data_array_[0], data_array_[1]

Лично я рекомендую заводить на каждый пункт меню отдельную локацию, но делать сами пункты меню более универсальными:

  • Формируем меню для предметов, например на самой первой локации в игре:

    %меню_предмет[] = ['Осмотреть', 'info']
    %меню_предмет[] = ['Использовать', 'use']
    %меню_предмет[] = ['Выбросить', 'put']
  • На локации-обработчике выделения предмета ($onobjsel) код может быть такой:

    ! записываем название выделенного предмета в переменую
    $object = $selobj
    ! сразу можно снять выделение
    unselect
    if $object="Отвёртка" or $object="Апельсин":
    ! если это нужный нам предмет
    ! вызываем меню
    menu "меню_предмет"
    end
  • На локациях-пунктах меню предметов используем условия, и по значению переменной $object определяем, какой предмет был выделен:

    ! для примера локация "info"
    if $object="Отвёртка":
    ! если мы "запомнили" предмет "Отвёртка" после выделения
    ! выводим описание отвёртки
    clr
    pl "Обыкновенная крестовая отвёртка. Подойдёт для регулирования громкости"
    end
    if $object="Апельсин":
    ! если мы "запомнили" предмет "Апельсин" после выделения
    ! выводим описание апельсина
    clr
    pl "Рыжий сладкий апельсин. Много нас, а он один."
    end

Таким образом через глобальные переменные мы можем передавать некоторые данные локациям-пунктам меню.

Примеры:


Footnotes

  1. Запись $меню_предмет[]= означает, что данные будут записаны в следующую ячейку после последней. Это аналог записи $меню_предмет[arrsize('$меню_предмет')]=. См. Как сделать контекстное меню