2017-04-22 13 views
0

テーブルに問題があり、ラベルを更新しています!ここではジレンマがあります。アイテムを売るたびにプレイヤーのコインを更新している、その部分が完璧に動作している、私のゲームに売りボタンがあります。私が抱えている問題は、この別個のメニューにある間に画面上でコインの価値を更新しようとしていることです(写真の左上のコインを参照してください)。問題は、コインの価値が別のクラスの別の段階にあることです。これは、下部にある異なるボタンをクリックすると、中央にポップアップするテーブルが異なるためです。私は、そのテーブルに入ってそのテーブルをクリアし、それを更新してこのアイテムページに送り返すヘルパーメソッドを試しましたが、それは動作しません、私は必要なコードを投稿できますが、これはラベルを更新する方法に関する一般的な質問ですステージ内のテーブル内でLibgdxテーブル内のラベルを更新する

Game Picture

更新:だからちょっと私の質問をまとめるために、私はスクリーンを持っていると私はそれで3つのテーブル下の表左上と右上を持っています。次に、私は彼らが在庫や店のボタンなどを押すと、真ん中のステージにテーブルを追加します。私がしたいのは、アイテムページを開いたままにして、単にCoinラベルの値を更新することです。 .setText()を使用してテキスト。イム私は、画面などの部分を更新する方法だけでわからない...

アップデート2:私はちょうどこの画面の新しい画面に画面のバック設定されている場合それはコインの値を更新しますが、私はオンになっていませんよもうアイテムページは理想的ではありません。

アップデート3:ヘルプ今のところみんなのためおかげで、@ジョンあなたの答えは、超便利aswellです。私はまだラベルが処理されているコードの少しここではこれを動作させていない。

playerCoinLabel = new Label(playerSave.getCoinsString(),skin,"defaultMiddle"); 

ここがテーブルに追加されています。

tableLeft = new Table(skin); 
stage.addActor(tableLeft); 
tableLeft.setBounds(0,0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
tableLeft.setFillParent(true); 
tableLeft.top().left(); 
tableLeft.add(healthNonButton).size(84,80).left().padLeft(10).padTop(5); 
tableLeft.add(playerHealthLabel).left().padLeft(15); 
tableLeft.row(); 
tableLeft.add(levelNonButton).size(74,70).center().padLeft(10); 
tableLeft.add(playerLevelLabel).left().padLeft(19); 
tableLeft.row(); 
tableLeft.add(coinNonButton).size(74,70).center().padLeft(10); 
tableLeft.add(this.playerCoinLabel).left().padLeft(15);   //This line 
tableLeft.row(); 

その後、私はあなたたちはについて私に言っていたようのsetTextを使用して、私のラベルを更新するため、この方法を持っています。

public void updatePlayerCoins() { 
    playerCoinLabel.setText(playerSave.getCoinsString()); 
} 

と私はどこでも、このメソッドを呼び出した場合、レンダリング()、または、それは私の画面の左上にラベルを変更/更新されていない新しいコイン値を設定イム。私はちょうどラベルを含むものを投稿する必要がある場合、私はgithubにすべてのコードを投稿することができます。これは単なる私のスキルセットを増やすために取り組んでいるプロジェクトなので、私が素人に聞こえるとすみませます。

ありがとうございました!

+0

NullPointerExceptionsの原因を確認してください。 – Sparcsky

+0

私はコードをポストすることができますが、これを行う前に、テーブルや何かの単一セルを簡単に更新する簡単な方法はありますか?私は変更リスナーを試しましたが、うまくいきませんでしたか? @Ian – johnnyboy5566

+0

簡単な方法は、そのラベルで 'setText'を呼び出すことです。画面上のレイアウトが自動的に更新されない場合は、コードに問題があります。 – Tenfour04

答えて

0

あなたは2つのことを尋ねているようです - ラベルを更新するにはどうすればよいですか?コードをどのように構造化しますか?私はあなたのコードを見ることができないので、前者で何がうまくいかないかを知ることは難しいですが、@ Tenfour04は正しいです。ラベルの参照をどこかに保持し、量を変更したいときはsetText()に電話してください。

限り、あなたのコードを構築するよう、私はシンプルなOOPのデザインを示唆した後、そのようにそれを進化さ:

まず、我々は選手を​​表すオブジェクトが必要です:

class Player { 
    private int coins; // Pretend there are getters/setters. 
    private int health; 
    private int level; 
} 

今、あなたはおそらく、あなたはこの選手情報を表現したい複数の方法を持っているので、私たちは別々のクラスにレンダリングコードを分割したり、クラスで設定します:

class StatWidget { 
    private Stage stage; 
    private Player player; 
    private Label lblCoins; 

    public StatWidget(Player player) { // Pseudo-code 
    this.player = player; 
    this.stage = new Stage(); 
    Table tbl = new Table(); 
    this.lblCoins = new Label(); // Notice we keep a reference to the label 
    tbl.add(this.coins); 
    } 

    public void update() { 
    lblCoins.setText(player.getCoins()); 
    } 
} 

今、あなたはすることができますPlayer#update()を呼び出すだけで、プレイヤーオブジェクトの状態とUIを同期させることができます。しかし、いつ呼びますか?

レンダリングメソッドでupdate()を呼び出すことができます。これは、更新が必要かどうかに関わらずオブジェクトを更新しているため、少し効率が悪いですが、単純ではありません。このようにUI要素を更新する場合は、おそらく問題ありません。個人的に、私はここでやります。

実際にプレイヤーのコインを変更した場合は、正確にはupdate()に電話をかけます。あなたはプレイヤーのコインを設定し、そのように更新の呼び出しを追加するには、コード内の場所を見つけることによってこれを行うことができます。

player.setCoins(A_LOT_OF_MONEY); 
statWidget.update(); 

問題はこれですすべてのあなたのゲームロジックwidgets-以上を追加すると、より面倒な取得今持っていますStatWidgetについて知り、それを呼び出します。イベント依存型アーキテクチャを使用することで、この依存関係を少しでも減らすことができます。基本的には、プレーヤーの状態が変わるたびに、変更を通知するイベントを関係者に送信します。あなたは以下の擬似コードを使用することができます。

interface Publisher { 
    void subscribe(Subscriber subby); 
    void unsubscribe(Subscriber subby); 
} 

class Player implements Publisher { 
    private List<Subscriber> subscribers; 
    private int coins; 
    // ... 

    public void setCoins(int amount) { 
    this.coins = amount; 
    for(Subscriber subscriber : subscribers) subscriber.notify("COINS", amount); 
    } 

    public void subscribe(Subscriber subby) { 
    this.subscribers.add(subby); 
    } 
    public void unsubscribe(Subscriber subby) { 
    this.subscribers.remove(subby); 
    } 
} 

interface Subscriber { 
    void notify(String event, int qty); 
    void dispose(); 
} 

class StatWidget implements Subscriber { 
    private Publisher player; 
    private Label label; 
    // ... 

    public StatWidget(Player player) { 
    this.player = player; 
    this.player.addSubscriber(this); 

    void notify(String event, int qty) { 
    if(event.equals("COINS")) label.setText(qty); 
    } 

    void dispose() { 
    this.player.unsubscribe(this); 
    } 
} 

を上記イベントシステムは確かに研磨することができ、あなたはおそらくジェネリック医薬品との巧妙な物事を行う(またはあなたのためにすべてを考え抜かれたライブラリを使用する)ことができますが、うまくいけば、それは概念を説明します。

+0

Hey ** @ John **答えに感謝します。私の記事のUpdate 3をご覧ください。 – johnnyboy5566

関連する問題