2017-03-23 5 views
0

Ich habe ein einfaches Spiel in LibGDX erstellt, das mehrere Bildschirme hat. Ich möchte einen bestimmten Bildschirm neu starten, nachdem ich einen Neustartknopf gedrückt habe, aber ich bin nicht sicher, wie man das macht. Ich habe etwas darüber recherchiert und alle Antworten führen dazu, dass ich meine Assets nicht in show() lade, sondern eher in einer init() -Methode, mit der ich nicht wirklich vertraut bin. Ich möchte wissen, wie kann ich einen Bildschirm mit dieser init() -Methode neu starten. Von jetzt an habe ich den Großteil meiner Initialisierung in den Konstruktor eingefügt und einige wurden in Methoden wie der restartButton() Methode initialisiert. Alle anderen Korrekturen oder Verbesserungen in meinem Code werden sehr geschätzt. Hier ist ein Ausschnitt aus meinem Code:Wie Neustart Bildschirm in LibGDX mit Init() Methoden?

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. 

} 

Diese Änderung ist eine Antwort auf eine Antwort von IronMonkey versehen, die das Problem zu lösen scheint, muss aber zusätzlichen Code. Das Problem hierbei ist, dass die Akteure des neugestarteten Bildschirms immer dann, wenn das Spiel neu gestartet wird, über den Akteuren auf dem vorherigen Bildschirm stehen (der Bildschirm vor dem Neustart). Hier ist ein neuer Ausschnitt aus meinem Code zeigt, wie das Spiel mit meinem GameInit neu zu starten():

 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

Die Weise, die ich normalerweise darüber gehen würde, ist nur ein neues Bildschirmobjekt zu erstellen, z. setScreen (neues LevelOneScreen()); – Eames

+0

Sie könnten auch nur Werte wie Positionswert usw. zurücksetzen – Eames

+0

Warum erstellen Sie nicht init-Methode mit dem Inhalt Ihres Konstruktors, alles aus dem Konstruktor und aus der Schaltfläche Listener? –

Antwort

1

show() wird automatisch aufgerufen, wenn der Bildschirm wird zuerst angezeigt.

Die init() -Methode ist eine, die Sie selbst erstellen. Sie können es nennen, was Sie wollen. Sie sollten nicht alle Assets in init() einfach alles einrichten, score = 0, player.setPosition (0,0) etc.

Also beim ersten Aufruf von init() setzt man alle Variablen. Wenn Sie init() erneut aufrufen, setzen Sie sie erneut. (re Satz)

Efter bearbeiten die Frage:

In den Verfahren von GameInit() aufgerufen Sie Dateien laden, die bereits geladen sind und fügen Akteure Bühnen, auf denen diese Akteure sind schon da und deshalb jetzt überlappend. Sie fügen auch Aktionen hinzu und erstellen bereits erstellte Objekte.

Alle GameInit() sollten Werte für diese bereits erstellten Objekte setzen. Also im Grunde:

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; 
} 

Laden und Erstellen von Objekten sollten nicht mehr als einmal durchgeführt werden. Versuchen Sie einfach, meine GameInit() -Methode hinzuzufügen, nennen Sie sie GameReset() und rufen Sie sie über Ihren Reset-Button auf.

+0

Ich habe getan, was Sie gesagt haben, aber sobald ich neu starte, überlappt es nur den vorherigen Zustand des Bildschirms wie zum Beispiel die Münzen werden zweimal mit der anderen Charge nur um ein paar Sekunden verzögert angezeigt. – JAlmazan

+0

Ich werde den Code sehen müssen, mit dem Sie arbeiten, um zu wissen, was los ist. – IronMonkey

+0

Ok Ich werde meine Frage bearbeiten, um mehr von meinem Code zu zeigen. – JAlmazan

Verwandte Themen