2013-10-15 12 views
7

Was ist die richtige Art, einen Bildschirm in Libgdx vollständig zu entsorgen? Momentan Wenn ich auf einen Knopf auf dem vorherigen Bildschirm klicke, macht der Knopf immer noch das, was er getan hätte, wenn ich auf diesem Bildschirm wäre. Sollte ich .dispose()-alles, was ich kann in der dispose() Methode sein? Oder gibt es eine einfachere Möglichkeit, alles auf dem Bildschirm zu entsorgen?Korrekte Weise, Bildschirme in Libgdx zu entsorgen

Antwort

17

Leider gibt es keinen einfacheren Weg. Diese Klassen teilen keine gemeinsame "" -Schnittstelle oder irgendetwas ähnliches, um dies automatisch zu tun. Alles, was eine dispose() Methode hat, muss manuell entsorgt werden, wenn es nicht mehr benötigt wird.

Dies gilt auch für die Screens selbst. Beim Umschalten von Screens werden sie nicht automatisch entsorgt, aber Sie müssen das selbst tun (vor dem Aufruf Game.setScreen()).

Auf der anderen Seite ist dies keine große Sache. Sehen Sie sich einfach alles in Ihrem Screen an und prüfen Sie, ob es entsorgt werden muss oder nicht. Wenn es eine Entsorgungsmethode gibt, rufen Sie sie in dispose() der Screen.

ABER das erklärt nicht Ihr Verhalten über unsichtbare Tasten von der letzten Screen. Ich nehme an, Sie verwenden eine Stage und verwendet Gdx.input.setInputProcessor(stage);. Diese Einstellung wird nicht geändert, wenn Sie den Bildschirm wechseln, und Sie müssen den Eingangsprozessor auf Stage Ihres aktuellen Screen setzen, oder auf den Eingang des aktuellen Screen. Auf diese Weise fängt die "alte" Stufe keine Eingaben mehr ab.

+0

Wie für alle Variablen? Wie würde ich mit ihnen umgehen? – Chris

+0

@ user2341336 Welche Variablen genau meinen Sie? Ich halte die meisten Dinge, die auf einem Screen-Schalter als private Eigenschaft der Screen-Klasse selbst entsorgt werden müssen, weil sie logisch zum Bildschirm gehört. – noone

2

Ich kann bestätigen, dass dieses Problem den Inpur-Prozessor eine neue Stufe nicht übergeben wird. Dies führt zu "Geister" -Buttons wie beschrieben.

0

Leider LibGDX API documentation sagt

Beachten Sie, dass() verfügen nicht automatisch aufgerufen wird. So

, was ich tun ist, entsorgen Sie alle Disposables (wie Stage, Skin, Texture ... etc) im Innern der hide() Methode im Screen weil hide() automatisch aufgerufen wird, und es funktioniert sehr gut!

Beispiel:

public class GameScreen implements Screen { 
... 
    @Override 
    public void hide() { 
     mainStage.dispose(); 
     playGroundStage.dispose(); 
     controller.dispose(); 
     labelActor.dispose(); 
    } 
... 
} 
+1

Ich würde nicht empfehlen, Dinge innerhalb der hide() - Methode zu entsorgen, da dies auf Android angerufen wird, wenn jemand Sie anruft –

Verwandte Themen