2016-09-04 7 views
0

私はどのアイテムを使用するのかをユーザーが選択できるようにしようとしています。これはminecraftと似ていますが、そのゲームでどのような種類のウィジェットが使用されているのかわかりません。私がやったことは、いくつかのボタンを作ってテーブルに追加して、それらが整列するようにすることです。しかし、ボタンの問題は、アイテムが選択されているかどうかを知る方法がないことです。クリックした後は、元の外観に変わります。私にとってLibgdx Scene2dのようなMinecraftのボタン

btnCube = new TextButton("Cube", btnStyle); 

     btnCube.addListener(new ClickListener(){ 
      @Override 
      public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
       WorldController.element = "cube"; 
       super.touchUp(event, x, y, pointer, button); 
      } 
     }); 

私は、画面上のプレイヤークリックが、それは、そのオブジェクトを生成しますときに、それを行うためのより良い方法があり、特定のテキストに文字列を設定しますか?なぜなら、アイテムを選択するために文字列に頼るだけでは適切ではないと思うからです。これは、あなたがそれが選択されているので、赤の項目がハイライト表示され、残りがないことがわかりますように私は、話していたものです

enter image description here

+1

ClickListenerの代わりにChangeListenerを使用します。ボタンが押されたときに、チェックされたDrawableを持つボタンスタイルを使用します。 – Tenfour04

+0

私はあなたが言ったことをしましたが、問題は現在、別のボタンがクリックされたときにボタンを自動無効にする方法です。 changeListenerの中に何を入れるべきですか? –

答えて

1

すべてのボタンに同じ変更リスナーを割り当てます。これは、ボタンがトグルされたときにそのメソッドchangedを呼び出します。ただし、ボタンをクリックしてボタンをオンからオフに切り替えることはできないため、変更をすべてのボタンに手動で適用する必要があります。だからまず、ボタンのグループ全体をセットに入れてください。

次に、changedが呼び出されたときに、どのボタンが押されたのかが分かるので、すべての状態を適切な状態に変更できます。

private ObjectSet<Button> toolButtons = new ObjectSet(); //put all buttons into this 

//add this same listener to all buttons. 
ChangeListener commonListener = new ChangeListener(){ 
    public void changed (ChangeEvent event, Actor actor){ 
     for (Button button : toolButtons){ 
      button.setChecked(button == actor); 
     } 
     setSelectedTool((Button)actor); 
    } 
}; 

void setSelectedTool(Button button){ 
    //however you are tracking the selected tool, you can apply the change 
    //here based on which button was pressed 
} 

//Also need to set programmatic change events false on all buttons to prevent stack overflow 
for (Button button : toolButtons) 
    button.setProgrammaticChangeEvents(false); 

どのツールが選択されているかを追跡するために文字列を使用しているようです。文字列を使用しているので、文字列の値を使用して便利にボタンの名前を付けてから、setSelectedToolメソッドでそのボタンを使用できます。例:

btnCube = new TextButton("Cube", btnStyle); 
btnCube.setName("cube"); 
btnCube.addListener(commonListener); 
toolButtons.add(btnCube); 

//... 
void setSelectedTool(Button button){ 
    WorldController.element = button.getName(); 
} 

しかし、文字列はこれを追跡する強力な方法ではありません。本当にあなたは列挙型を使うべきです。列挙型を使用する場合は、ボタンのユーザーオブジェクトに格納できます。

btnCube = new TextButton("Cube", btnStyle); 
btnCube.setUserObject(ElementType.CUBE); //example enum you need to create 
btnCube.addListener(commonListener); 
toolButtons.add(btnCube); 

//... 
void setSelectedTool(Button button){ 
    WorldController.element = (ElementType)button.getUserObject(); 
} 
関連する問題