2013-05-25 15 views
7

Używam grupy do przechowywania niektórych obrazów i narysowania ich w pakiecie SpriteBatch. Teraz chcę wykryć, które zdjęcie zostało kliknięte. Z tego powodu dodaję InputListener do grupy, aby uzyskać wydarzenie po dotknięciu. Wejściowy InputEvent otrzymał metodę (getTarget), która zwraca odwołanie do klikniętego Aktora.Wykrywanie wejścia dla grupy z nakładającymi się przezroczystymi obrazami

Po kliknięciu przezroczystego obszaru aktora, chcę zignorować nadchodzące wydarzenie. A jeśli za tym stoi aktor, chcę go użyć. Pomyślałem o czymś takim:

myGroup.addListener(new InputListener() { 
     @Override 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      Actor targetActor = event.getTarget(); 
      // is the touched pixel transparent: return false 
      // else: use targetActor to handle the event and return true 
     }; 
    }); 

Czy to właściwy sposób? Pomyślałem, że zwrot fałszywej informacji o metodzie touchDown będzie kontynuował propagację wydarzenia i pozwoli mi również otrzymywać zdarzenia typu touchdown dla innych podmiotów w tej samej pozycji. Ale to wydaje się być nieporozumieniem ...

UPDATE

P.T.s odpowiedź rozwiązuje problem uzyskanie prawa wydarzenie. Teraz mam problem z wykryciem, czy piksel trafienia jest przezroczysty. Wydaje mi się, że potrzebuję Obrazu jako mapy Pixmap, aby uzyskać dostęp. Ale nie wiem, jak przekonwertować obraz do Pixmapy. Zastanawiam się również, czy jest to dobre rozwiązanie pod względem wydajności i wykorzystania pamięci.

+0

Nie przechodzisz z obrazu do Pixmapy. Przechodzisz od Pixmap do Texture, aby przeciągnąć obraz. – NateS

+0

Czy wypróbowałeś rozwiązanie, które dostarczyłem? – ManishSB

Odpowiedz

5

Myślę, że chcesz zastąpić metodę Actor.hit(). Zobacz scene2d Hit Detection wiki.

Aby to zrobić, podklasa Image, i umieść tam swoją specjalizację hit. Coś jak:

public Actor hit(float x, float y, boolean touchable) { 
    Actor result = super.hit(x, y, touchable); 
    if (result != null) { // x,y is within bounding box of this Actor 
    // Test if actor is really hit (do nothing) or it was missed (set result = null) 
    } 
    return result; 
} 

Uważam, że nie można tego dokonać w touchDown słuchacza, ponieważ etap odpuściliśmy aktorów „za” tym jednym (tylko „rodzic” aktorów dostanie zdarzenie Touchdown jeśli return false tutaj) .

Powiązane problemy