Autor Wątek: AndEngine problem z usuwaniem sprita.  (Przeczytany 1208 razy)

Offline kokos22

  • Użytkownik

# Wrzesień 15, 2013, 16:07:12
Podczas pisania natknąłem się na dziwny problem. Programowałem  sprita, który zmienia się na kolejnego lub poprzedniego na liście po wciśnięciu odpowiedniego buttona.
public void SetLeftCard()
{
if(CardIndex== 0)return;
ResourcesManager.getInstance().engine.runOnUpdateThread(new Runnable(){

@Override
public void run() {
entity.detachChild(CardPresentation);
CardPresentation.detachSelf();
CardPresentation=null;


}});

CardIndex-=1;

ResourcesManager.getInstance().engine.runOnUpdateThread(new Runnable(){

@Override
public void run() {
TextureRegion region3 = TextureRegions.get(User.getInstance().Lista.get(CardIndex).Texture);

CardPresentation = new Sprite(CardPresentationX,CardPresentationY,100,200,region3,vbo);
entity.attachChild(CardPresentation);


}});



}
Powyższa funkcja oraz poniższa odpowiada za zmianę wyświetlanego sprita.
public void SetRightCard()
{
if(CardIndex== User.getInstance().Lista.size()-1)return;


ResourcesManager.getInstance().engine.runSafely(new Runnable(){

@Override
public void run() {


entity.detachChild(CardPresentation);
CardPresentation.detachSelf();
CardPresentation=null;

}});


CardIndex+=1;
TextureRegion region2 = TextureRegions.get(User.getInstance().Lista.get(CardIndex).Texture);
CardPresentation = new Sprite(CardPresentationX,CardPresentationY,100,200,region2,vbo);
entity.attachChild(CardPresentation);

}
Testowałem to na 2 obrazkach przy czym pierwszym startowym jest z tekstura karty o indeksie 0  na liście. Po wciśnięciu prawego buttona obrazek ładnie się zmienia jednak po wciśnięciu lewego buttona sprite zostaje zamieniony na identyczny. W debugerze widać, że do samego utworzenia nowego sprita tekstura jest pobierana poprawnie jako ta z indeksu 0. Dodatkowo po wciśnięciu (licząc od startu aplikacji) prawego ,lewego, prawego buttona następuje crash.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline wozix

  • Użytkownik

# Wrzesień 15, 2013, 21:10:28
A co LogCat mówi o tym crashu?
EDIT:
1.
A w ogóle, to ciągłe tworzenie karty troche nie ma sensu. Lepiej sobie gdzieś trzymać tę zmienną po uprzednim potraktowaniu:
Card.setVisible(false);
Card.setIgnoreUpdate(true);
Dodatkowo z tego co mi się wydaje tylko detach i dispose potrzebuje być wywoływany na .runOnupdateThread. Gdy używasz .attach() nie musisz tego pilnować.

2..runSafely() Po co tego używasz? Używaj runOnUpdateThread().
« Ostatnia zmiana: Wrzesień 15, 2013, 21:18:23 wysłana przez wozix »

Offline kokos22

  • Użytkownik

# Wrzesień 15, 2013, 21:31:15
Używam zwykle runOnUpdateThread() tego drugiego użyłem tylko szukając błędu a ten polegał na tym, że
CardIndex-=1; nie znajdował się w bloku do wykonania w bezpiecznym wątku, do tego nie buforowane wejście spowodowały asynchroniczne działanie - bezpieczny wątek bowiem nie należy do ciała tej funkcji.
--------------------------------------------------------------------------------------------------------------------------------------------
Problem rozwiązałem ale korzystając z zainteresowania tym postem mam jeszcze jeden drobny problem. Mam pewnego sprita, którego rejestruje jako touchArea. Po naciśnięciu  tworzy się  okno (sprite) zasłaniający cały wyświetlacz i posiadający własne dzieci tj buttony. Jeden button znajduje się w świetle tego pierwszego sprita i po jego naciśnięciu  tworzy  kolejne okno zamiast zniszczyć stare. 

Offline wozix

  • Użytkownik

# Wrzesień 15, 2013, 21:40:08
Sklasyfikuj sobie jakoś UI, choćby banalnym "isWindowOpened" i wtedy sprawdzaj w kodzie buttona, który tworzy okno, czy przypadkiem nie jest zasłonięty. Przesłanianie tych obszarów nie istnieje w andengine. Wykonuje się pierwszy obszar, który został zarejestrowany do silnika. (a może i nawet wszystkie obszary spełniające parametry dotyku?)

Offline kokos22

  • Użytkownik

# Wrzesień 15, 2013, 21:47:31
Z tego co zauważyłem przy dotknięciu w miejscu przysłaniania się 2 buttonów nie reaguje żaden. Ma może z tym coś wspólnego Z-index ? Ustawiałbym wtedy okna na samej górze jako pierwszoplanowe i  jako pierwsze do wykrywania dotyku.
« Ostatnia zmiana: Wrzesień 15, 2013, 21:51:31 wysłana przez kokos22 »

Offline wozix

  • Użytkownik

# Wrzesień 15, 2013, 21:59:19
Hmm.. A włączałeś multitouch przy wstepnych ustawieniach silnika? Jeśli nie, to spróbuj to zrobić. Pamiętam, że  u mnie działy się cyrki zanim tego nie zrobiłem. Z-Index działa chyba tylko i wyłącznie na kolejność rysowania.