0

そのため、プレーヤーの属性が変更されるたびにウィジェットを更新しようとしています。player は Player オブジェクトです。(大幅に)短縮されたバージョンは以下のとおりです。

class Stats(Object):
    def __init__(self, health, max_health):
        self.health=health
        self.max_health=max_health
class Player(Object):
    def __init__(self, stats):
        self.stats=stats

player= Player(Stats(50,100))

私の kivy ルート クラスは、プレーヤーの健康状態を示す ProgressBar を持つ BoxLayout です。

class GameRoot(BoxLayout):
    p= ObjectProperty(player)
    def do_something(self):
        self.p.stats.health-=5

do_something は、Enter キーが押されるたびに呼び出されます (これが機能することを確認しました)。GameRoot の .kv ファイルは次のとおりです。

GameRoot:
    ProgressBar:
        min:0
        max:root.p.stats.max_health
        value:root.p.stats.health

プレイヤーのヘルス (またはその他の属性) が変更されたときにウィジェットが更新されないことを除いて、すべてが正常に機能します。

GameRoot への次の変更により、更新されました。

class GameRoot(BoxLayout):
    phealth= ObjectProperty(player.stats.health)
    p= ObjectProperty(player)
    def do_something(self):
        self.phealth-=5
GameRoot:
    ProgressBar:
        min:0
        max:root.p.stats.max_health
        value:root.phealth

しかし、Player と Stats の両方に多くのインスタンス変数があり、それらが変更されるたびに更新する必要があるため、これは実際には良いオプションではありません。

助けていただければ幸いです。私は周りを見回しましたが、解決策は見つかりませんでした。

編集

すべてをプロパティに変更すると、関数でプロパティを使用しようとするとエラーが発生します。

class Stats(EventDispatcher):
    levels = ListProperty(levels)
    health = NumericProperty()
    xp = NumericProperty()
    level = NumericProperty()
    max_health = NumericProperty()
    def __init__(self, **kwargs):
        super().__init__(Stats, self).__init__(**kwargs)

    def set_level(self):
        for l in range(100):
            if self.xp < self.levels[l]:
                self.level= l-1
                break
s= Stats
s.health=10
s.xp=500
s.set_level()

次のエラーが表示されます: TypeError: set_level() missing 1 required positional argument: 'self'

コードの他の領域では、NumericProperties を int として使用できない、または ListProperties を添字化できないというエラーが表示されます。

明らかな何かが欠けている場合はお詫び申し上げます。最近Kivyを使い始めました。

4

0 に答える 0