стекируемые элементы и как изменить их количество для отображения с использованием интерполированных данных? - PullRequest
0 голосов
/ 01 февраля 2020

Я не очень опытный, и у меня есть прекрасный рабочий инвентарь, который я построил в renpy / python. Я столкнулся с некоторыми трудностями, когда пытался сделать свои вещи складными. Я пытался заставить мой объект элемента класса иметь редактируемую переменную / целое число. Я не уверен, что это синтаксис, который я ищу, или мне нужно расположить мои классы по-другому, и если да, то как? Раньше инвентарь просто добавлял идентичный предмет (и значок) на мой экран. Это то, что я хочу отобразить в указанном мной тексте:

class item(object):
        def __init__(self, name, img, himg, THIS THING):
            self.name = name
            self.img = img
            self.himg = himg
            self.THIS THING = THIS THING

Самая близкая из тех, что я получил, не получив сообщение об ошибке «имя не определено», несмотря на то, что имя определено явно или искажено как «% item Вместо этого в моем поле появляется текст .amountd:

label start:
     show screen inventory
     pause
     "adding another item"
     $ backpack.add_item(popcorn)
     jump start

return



default popcorn = item("popcorn", "inventory/ragepop_idle.png", "inventory/ragepop_hover.png", 0)
default money = 50
default backpack = container()
default inv = []



######screen
screen inventory():
    zorder 2
    add "images/inventory/inventorybg.png"
    modal True
    text "Money: [money]0" xpos 310 ypos 60 color("#FFFFFF")

    hbox:
        xpos 298 ypos 113
        spacing 7
        xmaximum 695
        box_wrap True
        for thing in backpack.inv:
            imagebutton idle thing.item.img hover thing.item.himg action Null
            text "{b}[thing.item.amt]{/b}" size 20 color("#FFFFFF") xoffset -30 yoffset 5


    imagebutton:
        idle "inventory/invpois.png"
        hover "inventory/invpois2.png"
        focus_mask True
        action Hide("inventory")

##amt is what I settled on for the THIS THING
init python:
    class item(object):
        def __init__(self, name, img, himg, amt):
            self.name = name
            self.img = img
            self.himg = himg
            self.amt = amt

    class invitem(object):
        def __init__(self, item, amount):
            self.item = item
            self.amount = amount


    class container(object):
        def __init__(self):
            self.inv = []


## Disregard these add/remove methods as I have to change these once I figure out how to $ amt+=1
##As they stand now, they serve to put the icon in the inventory the old unstackable way.

        def add_item(self, item, amount=1):
            self.inv.append(invitem(item, amount))
            return("success")

        def has_item(self, item, amount=1):
            if item in [i.item for i in self.inv]:
                if self.finditem(item).amount >= amount:
                    return(self.finditem(item).amount)
                else: return(False)
            else:
                return(False)

        def finditem(self, item):
            return(self.inv[[i.item for i in self.inv].index(item)])

        def remove_item(self, item, amount=1):
            if self.has_item(item):
                self.finditem(item).amount -= amount
                if self.finditem(item).amount <= 0:
                    self.inv.pop(self.inv.index(self.finditem(item)))
                    return ("gone")
                else:
                    return ("more left")
            else:
                return ("not found")

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

К сожалению, 0 - это все, что я положил туда, и я не могу понять, как прибавить или вычесть '' amt '' во время игры, вызвав предмет или попытавшись получить элемент, чтобы вызвать легко редактируемую переменную и отобразить ее как «amt».

Это та часть, где я должен рассказать вам все, что я пробовал. Это тяжело для меня, потому что я пробовал так много вариаций стольких разных вещей, что не могу понять, что именно было напечатано. По сути, я поиграл со всеми вариантами интерполяции amt, которую я мог найти через документацию и результаты форумов других людей, и пытался заставить его работать с моими предметами, и в основном получил кучу «У элемента класса нет атрибута amt» и "имя не определено". После того, как это не удалось, я попытался убедить свой предмет получить его из совершенно отдельной переменной. Я успешно и легко использовал интерполированный текст для отображения денег на экране инвентаря. он просто запрашивает "текстовые" деньги: [деньги] .0 "и легко изменяется во время игры с $ money 1 + 10 и т. д. c. Я просто не смог убедить его в правильной работе, если интерполированная информация, которую я Я пытаюсь получить его из класса предметов.

Заранее благодарим вас за любые идеи о том, что я делаю неправильно!

1 Ответ

0 голосов
/ 01 февраля 2020

Я понял, что пошло не так! Мне нужно было дать свойства моего предмета класса! Вот что получилось!

        def __init__(self, name, img, himg, amt):
            self.name = name
            self.img = img
            self.himg = himg
            self.amt = amt

        @property
        def output(self):
            return str(self.amt)

        def add_stack(self, amt):
            self. amt += 1

    class invitem(object):
        def __init__(self, item, amount):
            self.item = item
            self.amount = amount```
...