2013-10-15 9 views
7

Jaki jest właściwy sposób całkowitego usunięcia ekranu w Libgdx? Obecnie Jeśli kliknę, gdzie przycisk był na moim poprzednim ekranie, przycisk nadal wykonuje to, co zrobiłbym, gdybym był na tym ekranie. Czy powinienem być .dispose() -ing wszystko co mogę w metodzie dispose()? czy istnieje prostszy sposób na pozbycie się wszystkiego na ekranie?Właściwy sposób utylizacji ekranów w Libgdx

Odpowiedz

17

Niestety nie ma łatwiejszego sposobu. Te klasy nie udostępniają żadnego zwykłego interfejsu "Disposable" lub czegoś podobnego, aby zrobić to automatycznie. Wszystko, co ma metodę dispose(), należy ręcznie umieścić, gdy nie jest już potrzebne.

Dotyczy to również samych Screens. Po przełączeniu Screens nie zostaną automatycznie usunięte, ale musisz to zrobić samodzielnie (przed wywołaniem Game.setScreen()).

Z drugiej strony nie jest to wielka sprawa. Wystarczy przejrzeć wszystko w swoim Screen i sprawdzić, czy należy go usunąć, czy nie. Jeśli istnieje metoda usuwania, zadzwoń w dispose() z Screen.

ALE to nie wyjaśnia twojego zachowania dotyczącego niewidocznych przycisków z ostatniego Screen. Przypuszczam, że używasz Stage i używasz Gdx.input.setInputProcessor(stage);. To ustawienie nie zostanie zmienione po zmianie ekranu i konieczne będzie ustawienie procesora wejściowego na Stage bieżącego Screen lub na to, co obsługuje dane wejściowe w bieżącym Screen. W ten sposób "stary" etap nie będzie już wychwytywał żadnych danych wejściowych.

+0

Jak w przypadku wszystkich zmiennych? Jak sobie z nimi poradzę? – Chris

+0

@ user2341336 Które zmienne dokładnie masz na myśli? Większość rzeczy, które należy usunąć na przełączniku ekranu, zachowuję jako własność prywatną samej klasy Screen, ponieważ logicznie należy ona do ekranu. – noone

2

Mogę potwierdzić, że ten problem nie przekazuje inpur procesorowi nowego etapu. spowoduje to pojawienie się przycisków "duchów" zgodnie z opisem.

0

Niestety LibGDX API documentation mówi

Zauważ, że rozporządzania() nie jest wywoływana automatycznie.

Więc co robię jest zbycie wszystkich jednorazowych (takich jak Stage, Skin, Texture ... itp) wewnątrz metody w Ekranie hide() ponieważ hide() nazywa się automatycznie i działa bardzo dobrze!

przykład:

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

Nie polecam wyrzucania rzeczy w metodzie hide() - metoda ta jest wywoływana na Androidzie, jeśli ktoś do ciebie dzwoni –

Powiązane problemy