2015-10-11 17 views
5

私のプログラムでは、ダイアログボックスを実装するのに苦労しています。メインプログラムはステージを使用しません。しかし、ユーザーの生活が0になったら、ゲームを再起動するかゲームを終了するダイアログをポップアップしたいと思います。libgdxを使ってダイアログボックスを正しく実装する方法

次のコードを使用して、ダイアログ用に別のクラスを作成しました。

public class GameOver { 

    //dialog game over 
    private Dialog dlgGameOver; 
    private Skin skin; 
    private Stage stage; 
    private TextButton btnMain; 
    private TextButton btnTryAgain; 
    private GameScreen gameScreen; 

    public GameOver(final GameScreen gameScreen){ 
     //create the game over dialog 
     this.gameScreen = gameScreen; 
     skin = new Skin(Gdx.files.internal("uiskin.json")); 
     dlgGameOver = new Dialog(" ",skin); 
     stage = new Stage(); 
     btnMain = new TextButton("Main", skin); 
     btnTryAgain = new TextButton("Try Again", skin); 
     dlgGameOver.text("Game over!"); 
     dlgGameOver.button(btnTryAgain); 
     dlgGameOver.button(btnMain); 
     dlgGameOver.show(stage); 
     btnMain.addListener(new ChangeListener() { 
      @Override 
      public void changed(ChangeEvent event, Actor actor) { 
       System.out.println("Button Pressed"); 
      } 
     }); 
     btnTryAgain.addListener(new ChangeListener() { 
      @Override 
      public void changed(ChangeEvent event, Actor actor) { 
       gameScreen.setIntLives(3); 
       gameScreen.setIntScore(0); 
       System.out.println("Button Pressed"); 
      } 
     }); 
     Gdx.input.setInputProcessor(stage); 

    } 

    public Stage getStage() { 
     return stage; 
    } 
} 

メインゲーム画面はステージを使用していません。肝臓は、renderメソッドでは0

if(intLives == 0) { 
    if(!boolGameOver) { 
     dlgGameOver = new GameOver(this); 
     boolGameOver = true; 
    } else if(intLives !=0) { 
     boolGameOver = false; 
    } 
} 

である場合、更新方法では、私は、ステージこれは完全にダイアログが作成された初めての作品

if(intLives == 0) { 
    dlgGameOver.getStage().draw(); 
} else { 
    //<rest of normal update code follows here> 
} 

を描くゲームオーバークラスを作成します。再起動するとゲームが再開されます(または実際にスコアと寿命がリセットされます)。しかし、2度目の生活習慣がなくなると、ダイアログは期待通りに表示されますが、ボタンは機能しません。どうにかして、clicklistenerが2回目に初期化されていないようです。

私はここで何か根本的に間違っていますか?もし私のアプローチが完全に間違っていれば、私もそれを聞いてうれしいです。

答えて

7

Dialogクラスは、より詳しく見ていないと少し直感的です。

import com.badlogic.gdx.ApplicationAdapter; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.scenes.scene2d.Stage; 
import com.badlogic.gdx.scenes.scene2d.ui.Dialog; 
import com.badlogic.gdx.scenes.scene2d.ui.Skin; 
import com.badlogic.gdx.utils.Timer; 
import com.badlogic.gdx.utils.Timer.Task; 

public class TestGame extends ApplicationAdapter 
{ 
    Dialog endDialog; 

    Skin skin; 
    Stage stage; 

    @Override 
    public void create() 
    { 
     skin = new Skin(Gdx.files.internal("uiskin.json")); 

     stage = new Stage(); 

     Gdx.input.setInputProcessor(stage); 

     endDialog = new Dialog("End Game", skin) 
     { 
      protected void result(Object object) 
      { 
       System.out.println("Option: " + object); 
       Timer.schedule(new Task() 
       { 

        @Override 
        public void run() 
        { 
         endDialog.show(stage); 
        } 
       }, 1); 
      }; 
     }; 

     endDialog.button("Option 1", 1L); 
     endDialog.button("Option 2", 2L); 

     Timer.schedule(new Task() 
     { 

      @Override 
      public void run() 
      { 
       endDialog.show(stage); 
      } 
     }, 1); 

    } 

    @Override 
    public void render() 
    { 
     Gdx.gl.glClearColor(1, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     stage.act(); 
     stage.draw(); 

    } 

    @Override 
    public void dispose() 
    { 
     stage.dispose(); 
    } 
} 

ダイアログオプションをクリックするたびに(オプション1またはオプション2)結果オブジェクトがのSystem.out(ここでは1Lまたは2Lに印刷されている:私は小さな作業例を提供する理由です

、任意のオブジェクトにすることができます)、ダイアログが1秒で再び表示されます。

uiskinはlibgdxテストから取得されます。

protected void result(Object object) 
{ 
    if (object.equals(1L)) 
    { 
     gameScreen.setIntLives(3); 
     gameScreen.setIntScore(0); 
     System.out.println("Button Pressed"); 
    } else { 
     // Goto main menut 
    } 
}; 

そして、このようなボタンを追加します:ダイアログクラスだけであることを

endDialog.button("Retry", 1L); 
endDialog.button("Main Menu", 2L); 

注意をあなたに結果方法を変更することができ、あなたのニーズに、より適合するように

一度インスタンス化される。

try 
{ 
    endDialog.button("doX", 
      ClassReflection.getDeclaredMethod(this.getClass(), "doX")); 
    endDialog.button("doY", 
      ClassReflection.getDeclaredMethod(this.getClass(), "doY")); 
} catch (ReflectionException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
:任意のオブジェクトを使用すると、リフレクションを使用することができます使用することができますので

:ちょうどあなたがそれで何ができるかのアイデアを与えるために


(ので、私のコメントは正しくありませんでした)

と結果方法は次のようになります。今、あなただけのこれらのメソッドを実装する必要があります

protected void result(Object object) 
{ 
    try 
    { 
     ((Method) object).invoke(TestGame.this); 
    } catch (ReflectionException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
}; 

ちょっとしたアイデアを伝えてください。

+4

何ですか?なぜここで反射を使用するのですか?o_O – noone

+0

ここでは、文字通りすべてのもので、ここでオブジェクトとして使用できるものについて別のオプションを与えたかっただけです。私は答えからもっと分けます。 –

+0

さて、それは理にかなっています。 – noone

関連する問題