2013-06-04 11 views
5

poprosiłem to na forach libgdx ale nie otrzymałem odpowiedzi więc ja ufałem y'all może mi pomóc:Scene2d - Obrócony aktor nie tlumaczy jak oczekiwano

mam Podmioty reprezentujące pionki. Próbuję zrobić to tak, aby gracz mógł kliknąć i przeciągnąć kafelek, aby przesunąć go po ekranie i obrócić go kilka razy przed przesłaniem polecenia placeTile. Z tego, co rozumiem przez DragAndDrop, nie wydaje mi się, aby był zaprojektowany z myślą o moim przypadku użycia, więc pomyślałem, że zamiast tego do każdego fragmentu gry dołączę detektor dragListener (kod poniżej). Działa dobrze w przypadku przeciągania, ale nie mogę określić, jak ustawić "minimalną odległość przed rozpoczęciem przeciągania" na 0 ... ale to nie jest moje główne pytanie (chociaż wszelkie spostrzeżenia byłyby mile widziane). Duży problem pojawia się, gdy obracam aktora, a następnie próbuję go przeciągnąć: Przy obrocie o 30 stopni, przeciąganie działa prawie jak normalnie: przy 60 stopniach, bardzo małe ruchy myszy wysyłają aktora poruszającego się w ciasnym kole bardzo szybko. Kolejne 30 stopni, aktor kafli wychodzi z ekranu w 1-2 klatkach, poruszając się szerokim łukiem. Jeśli aktor jest obracany zgodnie z ruchem wskazówek zegara, jego ruchy są zgodne z ruchem wskazówek zegara; ten sam wzór dla przeciwnie do ruchu wskazówek zegara.

Wygląda na to, że tłumaczenie aktora uwzględnia rotację; Domyślam się, że moje pytanie brzmi: czy można obrócić aktora/grupę bez rotacji wpływającej na przyszłe tłumaczenia? Alternatywnie, czy istnieje lepszy sposób na przeciągnięcie aktora po ekranie w oparciu o dane wejściowe dotykowe/myszą? I zawarte poniżej kodu: Wyobrażam sobie, ja przekręcane coś podstawowe, ale nie mogę dowiedzieć się, co:

// during initial stage creation 
tileActor.setOrigin(tileActor.getWidth()/2, tileActor.getHeight()/2); 
tileActor.addListener(new DragListener() { 
     public void dragStart(InputEvent event, float x, float y, 
       int pointer) { 
      chosenTileActor = event.getTarget(); 

     } 

     public void drag(InputEvent event, float x, float y, int pointer) {    
      Actor target = event.getTarget();    
      target.translate(x, y); 
     } 

    }); 

I dla słuchacza, który zajmuje się obrotem poprzez przewijanie kółkiem myszy:

multiplexer.addProcessor(new InputAdapter() { 
    @Override 
    public boolean scrolled(int amt) { 
     if (chosenTileActor == null) 
      return false; 
     else 
      chosenTileActor.rotate(amt * 30); 
     return true; 

    } 
    }); 

Jakieś wskazówki? Czy idę w dobrym kierunku, używając DragListener?

Dzięki za przeczytanie!

Odpowiedz

7

Zamiast tłumaczenia, wystarczy ustawić pozycję aktora bezpośrednio do współrzędnych etapie swojego zdarzenie przeciągania:

tileActor.addListener(new DragListener() { 
    private float offsetX, offsetY; 

    @Override 
    public void dragStart(InputEvent event, float x, float y, int pointer) { 
    Actor target = event.getTarget(); 
    this.offsetX = event.getStageX() - target.getX(); 
    this.offsetY = event.getStageY() - target.getY(); 
    } 

    @Override 
    public void drag(InputEvent event, float x, float y, int pointer) { 
    event.getTarget().setPosition(event.getStageX() - offsetX, event.getStageY() - offsetY); 
    } 
}); 

mam obliczaniu przesunięć w dragStart tak, że aktor nie od razu przeskoczyć do gdziekolwiek kliknięto, gdy zacząłem przeciągać (przeciągając względem mojej myszy). Testowane i działa z dowolnym obrotem.

+1

To działało idealnie, dzięki! –

+0

Spójrz na metodę 'setTapSquareSize'. Jeśli chcesz, ustaw go na 0F. – Alexmelyon

Powiązane problemy