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
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.
Mogę potwierdzić, że ten problem nie przekazuje inpur procesorowi nowego etapu. spowoduje to pojawienie się przycisków "duchów" zgodnie z opisem.
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();
}
...
}
Nie polecam wyrzucania rzeczy w metodzie hide() - metoda ta jest wywoływana na Androidzie, jeśli ktoś do ciebie dzwoni –
Jak w przypadku wszystkich zmiennych? Jak sobie z nimi poradzę? – Chris
@ 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