2017-03-23 10 views
0

私は複数の画面を持つLibGDXで簡単なゲームを作成しました。私は、再起動ボタンをタッチした後、特定の画面を再開したいが、私はそれを行う方法がわからない。私はこれに関するいくつかの調査を行いましたが、すべての答えはshow()ではなく、私がよく慣れていないinit()メソッドで資産を読み込まないようにします。 このinit()メソッドを使って、どのように画面を再起動することができますか?現時点では、ほとんどの初期化をコンストラクタに入れ、restartButton()メソッドなどのメソッドで初期化したものもあります。私のコードでの修正や改善は高く評価されます。ここに私のコードの抜粋です:Init()メソッドを使用してLibGDXの画面を再起動するには?

public class LevelOneScreen implements Screen { 

public MainShooter app; 
private Stage stage; 
private Stage stageCoin; 
private Stage stageScore; 
private Stage stageEnemies; 
private Stage stageFX; 
private Stage stageButton; 

public Image aImage; 
public Image bImage; 
public Image cImage; 
public Image dImage; 

public Array<AntAnimation> AntAnimate; 
public Array<CrumbAnimation> CrumbAnimate; 
public Array<CoinAnimation> CoinAnimate; 

public Texture firstTex; 
public Texture secTex; 
public Texture thirdTex; 
public Texture fourthTex; 


public LevelOneScreen(final MainShooter app){ 

this.app = app; 
this.stage = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera)); 
this.stageCoin = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera)); 
this.stageScore = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera)); 
this.stageEnemies = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera)); 
this.stageFX = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera)); 
this.stageButton = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera)); 

AntAnimate = new Array<AntAnimation>(); 
CrumbAnimate = new Array<CrumbAnimation>(); 
CoinAnimate = new Array<CoinAnimation>(); 

restartButton(); 
levelOneBackground(); 
coinScore(); 


} 


public void show() { 


    inputMultiplexer = new InputMultiplexer(); 
    inputMultiplexer.addProcessor(stageCoin); 
    inputMultiplexer.addProcessor(stageScore); 
    inputMultiplexer.addProcessor(stageEnemies); 
    inputMultiplexer.addProcessor(stageFX); 
    inputMultiplexer.addProcessor(stageButton); 

    Gdx.input.setInputProcessor(inputMultiplexer); 

    } 

    public void levelOneBackGround(){ 
    //code for the background 
    } 


    public void coinScore(){ 
    //code for coinScore 
    } 

    public void restartButton(){ 
    firstTex = MainShooter.manager.get("button.png", Texture.class); 
    aImage = new Image(firstTex); 
    stageButton.addActor(aImage); 
    aImage.addListener(new ActorGestureListener() { 
     public void touchDown(InputEvent event, float x, float y, int pointer, int button) { 

     // Creating new LevelOneScreen somehow affects the fps of my game. 
     app.setScreen(new LevelOneScreen(app)); 


     }}); 
    } 


//some other codes like dispose, hide, etc. 

} 

この編集は、問題を解決するようだが、追加のコードを必要とIronMonkeyが提供する答えへの応答です。ここで問題となるのは、ゲームを再開するたびに、再起動した画面のアクタが前の画面のアクタ(再起動する前の画面)の上に表示されることです。

 public void GameInit(){ 
    levelOneBackground(); 
    scoreInt = 0; 
    coinInt = 0; 
} 


public void levelOneBackground(){ 

     Runnable runAntAct1 = new Runnable(){ 
      public void run(){ 
       antAct1(); 
      } 
     }; 
     Runnable runAntAct2= new Runnable(){ 
      public void run(){ 
       antAct2(); 
      } 
     }; 
     Runnable runAntAct3 = new Runnable(){ 
      public void run(){ 
       antAct3(); 
      } 
     }; 
     Runnable runCoins = new Runnable(){ 
      public void run(){ 
       coinScattered(); 
      } 
     }; 
     levelOneTexture = CoinAssets.manager.get("woodenTable.png",Texture.class); 
     levelOneImage = new Image(levelOneTexture); 
     levelOneImage.setSize(app.screenWidth,app.screenHeight); 
     levelOneImage.setPosition(0,0); 
     stage.addActor(levelOneImage); 
     levelOneImage.addAction(sequence(run(runAct1),delay(2f),run(runAct2),delay(2f),run(runAct3),delay(2f),run(runCoins))); 


} 

public void restartButton(){ 
    //some code for the position, size, texture of the button. 
    restartButton.addListener(new ActorGestureListener() { 
      public void touchDown(InputEvent event, float x, float y, int pointer, int button) { 
       GameInit();}}); 
} 


public void antAct1(){ 
     for(int i = 1; i < 4; i++){AntAnimate.add(new AntAnimation(app));} 

     AntAnimate.get(1).setPosition(x,y); 
     stageEnemies.addActor.(AntAnimate.get(1)); 
     AntAnimate.get(1).addAction(//some actions); 

      AntAnimate.get(2).setPosition(x,y); 
     stageEnemies.addActor.(AntAnimate.get(2)); 
     AntAnimate.get(2).addAction(//some actions); 

      AntAnimate.get(3).setPosition(x,y); 
     stageEnemies.addActor.(AntAnimate.get(3)); 
     AntAnimate.get(3).addAction(//some actions); 

} 

public void antAct2(){ 
    //almost the same with antAct1() 
} 

public void antAct3(){ 
    //almost the same with antAct1() 
} 

public void coinScattered(){ 
    //almost the same with antAct1() 
} 
+0

私が通常これについて行う方法は、新しいScreenオブジェクトを作成することです。 setScreen(新しいLevelOneScreen()); – Eames

+0

位置のスコアなどの値をリセットすることもできます – Eames

+0

コンストラクタの内容、コンストラクタの内容、ボタンリスナのすべてを使ってinitメソッドを作成してみませんか? –

答えて

1

ショー()画面が表示されたときに自動的に呼び出されます。ここに私のGameInit()を使用してゲームを再起動する方法を示す私のコードの新しいスニペットがあります。

init()メソッドは自分で作成したものです。 好きなように呼び出すことができます。 init()内のすべてのアセットをロードするべきではなく、すべての値を設定するだけです。score:0、player.setPosition(0,0)など

最初にinit()を呼び出すと、 init()をもう一度呼び出すと、それらを再度設定します。 (セット)質問の

Efter編集:GameInit(から呼び出されるメソッドで

)すでにロードされているファイルをロードし、それらの俳優がすでに存在し、したがって、今の段階に役者を追加重複。また、アクションを追加して、すでに作成されたオブジェクトを作成します。

すべてのGameInit()は、既に作成されたオブジェクトの値を設定する必要があります。したがって、基本的 :オブジェクトの

private void GameInit(){ 
     AntAnimate.get(1).setPosition(x,y); 
     AntAnimate.get(2).setPosition(x,y); 
     AntAnimate.get(3).setPosition(x,y); 
     levelOneImage.setPosition(0,0); 
     scoreInt = 0; 
     coinInt = 0; 
} 

ロードと作成が複数回行われるべきではありません。私のGameInit()メソッドを追加してGameReset()と呼び、リセットボタンから呼び出してください。

+0

私はあなたが言ったことをしましたが、再起動するとただちに画面の前の状態が重なってしまいます。たとえば、コインが2回表示され、他のバッチは数秒遅れるだけです。 – JAlmazan

+0

何が起こっているのかを知るために、作業しているコードを見なければなりません。 – IronMonkey

+0

私の質問を編集して、より多くのコードを表示します。 – JAlmazan

関連する問題