Пример инвентаря (кликабельный)

init -2 python:
    items = [] # пустой список
    last_item = None # пустой последний нажатый пункт
    # регистрируем канал для списка,
    # чтобы он не выключал звуки из игры:
    renpy.music.register_channel("itms", "sfx", False)
    # здесь может быть любой обработчик нажатия кнопки из списка
    def SelectItemF(index):
        # сюда ставить код обработчика на питоне
        # например, удалим пункт из списка и запомним его значение
        if (index >= 0) and (index < len(items)):
            last_item = items.pop(index)
            # а если не хотим удалять нажатый пункт:
            # last_item = items[index]
            # теперь добавим звук нажатия на пункт списка:
            renpy.play("sounds/buy.mp3", channel="itms")
            # а это чтобы перерисовать/обновить экраны:
            renpy.restart_interaction()
    # превращаем функцию в action
    SelectItem = renpy.curry(SelectItemF)
    # получить имя файла
    def GetFN(index=0):
        global items
        if (index >= 0) and (index < len(items)):
            fn, hn = items[index]
            return "inventory/" + fn + ".png"
        else:
            return ""
    # получить подсказку
    def GetHint(index=0):
        global items
        if (index >= 0) and (index < len(items)):
            fn, hn = items[index]
            return hn
        else:
            return ""

init:
    image bg world1 = "bg_world1.png"
    image mario = "mario.png"
    $ invent = False

screen inventory:
    zorder 111
    default tt = Tooltip(" ")
    frame:
        xalign 1.0
        background Solid("#0000")
        xmaximum 130
        ymaximum 450
        xfill True
        vbox:
            imagebutton auto "inventory/bag_%s.png" action SetVariable("invent", not invent)
            if invent:
                text tt.value
                hbox:
                    viewport id "box":
                        yinitial 9999
                        xmaximum 0.9
                        mousewheel True
                        draggable True
                        vbox:
                            for i in range(0, len(items)):
                                imagebutton:
                                    idle Image(GetFN(i))
                                    hover Image(GetFN(i))
                                    hovered tt.Action(GetHint(i))
                                    # действие при нажатии на пункт:
                                    action SelectItem(i)
                    vbar yfill True value YScrollValue("box")

label start:
    scene black
    # начальные значения для списка
    $ last_item = None
    $ items = [("coin", "Денюжка"), ("flower", "Цветочег"), ("goomba", "Гумба")]
    # экран со списком:
    show screen inventory
    scene bg world1
    show mario
    with dissolve
    "Нажми на чемоданчик. Затем жми на экран."
    # добавление пунктов в список:
    $ items.extend([("mushroom", "Грыбок"), ("plant", "Сорняк"), ("star", "Пёздочка")])
    "В инвентарь добавлено три предмета."
    return

    # чтобы узнать из любого места последний нажатый пункт:
    # if last_item != None:
        # fn, hn = last_item
        # в fn будет имя файла картинки,
        # в hn - имя пункта, подсказка
        # после чего переменную по желанию можно обнулить
        # last_item = None

Комментарии

  1. А есть ли возможность реализовать вывод контекстного меню при наведении на элементы инвентаря?

    ОтветитьУдалить
    Ответы
    1. поменял код. теперь можно совершать действия по клику (при нажатии элемента списка вызывается функция SelectItem в самом начале скрипта) и выводятся подсказки при наведении курсора. только первый элемент без подсказки всегда, но это уже косяк не мой, баг движка, походу.

      Удалить
  2. прикрутить подсказки к пунктам. вот описание подсказок:
    http://www.renpy.org/doc/html/screen_actions.html

    ОтветитьУдалить
  3. Получается я сделал так,
    if SelectItem == "key":
    jump start
    и выдаёт ошибку 'int' object is not callable
    Как int сделать вызываемой?

    ОтветитьУдалить
    Ответы
    1. вы пытаетесь из скрипта вызвать функцию, которую вообще нельзя вызывать. она сама вызывается при нажатии кнопки. код ее обработчика и нужно создать вместо этого комментария «# сюда ставить код обработчика на питоне».
      selectaction - это действие (action) для нажатия кнопок, его нельзя использовать из скрипта.
      если хочется кого-то куда-то послать по нажатию на ключик, то в этом самом обработчике после строки renpy.restart_interaction() следует добавить это:

      if last_item[0] == "key":
      renpy.jump("opendoor")
      last_item = None # это чтобы не использовать удаленный из списка предмет дважды. использовали и забыли. из инвентаря одноразовый предмет тоже нужно удалять (командой pop)

      Удалить
  4. День добрый. А каким образом объявляется обычный imagebutton? Например, для возврата на предыдущую сцену.

    ОтветитьУдалить
    Ответы
    1. imagebutton auto "btn_back_%s.png" focus_mask True action Rollback()
      в папке images должно быть минимум 2 файла:
      btn_back_idle.png и btn_back_hover.png

      и еще по теме:
      1) http://pastebin.com/z7PAVMya
      2) https://www.renpy.org/doc/html/style_properties.html
      3) https://www.renpy.org/wiki/renpy/doc/tutorials/Style_Customization

      Удалить
    2. Уже пробовал так. Получаю при запуске вот такое(
      http://www.imagebam.com/image/b53bc6492230134

      Удалить
    3. Может эту кнопку нужно в ините как-то объявлять?

      Удалить
    4. я не гугл и не дебагер, сорри. на вопросы по теме и не по теме уже ответил.
      консультации есть в группе https://vk.com/renpy

      Удалить
  5. Самый тупой вопрос: в какой папке это всё писать? В script, options или screen? Я вигачу ВН в renpy 6.16, и папки gui у меня нет.

    ОтветитьУдалить
    Ответы
    1. Код должен быть в script если не понятно скачайте проект в самом верху и переместите его в папку ren'py тогда вы сможете его запустить и посмотреть как всё сделанно

      Удалить

Отправить комментарий