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
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.
Ich kann bestätigen, dass dieses Problem den Inpur-Prozessor eine neue Stufe nicht übergeben wird. Dies führt zu "Geister" -Buttons wie beschrieben.
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();
}
...
}
Ich würde nicht empfehlen, Dinge innerhalb der hide() - Methode zu entsorgen, da dies auf Android angerufen wird, wenn jemand Sie anruft –
Wie für alle Variablen? Wie würde ich mit ihnen umgehen? – Chris
@ 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