2012-12-17 9 views
18

Jeśli dobrze zrozumieć, libgdx obraca obrazu z wykorzystaniem metody addActions:Jak obrócić aktora obrazu w libgdx o środkowy punkt?

this.addAction(parallel(rotateBy(360, 0.5f), moveTo(320, 100, 0.5f))); 

Chodzi o to, że jest obracany przez punkt = (0,0) obrazu.

Oto moje pytanie:

Czy istnieje sposób obrócić obraz przez punkt centrum obiektu? Coś jak przypięcie go w środku, a potem obrócenie go jak koła w samochodzie? Oba rotateBy i rotateTo metody włączyć go w punkcie (0,0) samego obrazu.

Odpowiedz

29

Musisz odpowiednio ustawić "pochodzenie" swojego aktora. Z API aktora można odczytać, że początek jest względny w stosunku do pozycji i jest używany do skalowania i obrotu.

Oblicz więc swój środkowy punkt i ustaw początek na środkowy punkt.

Actor a; 
.... 
a.setOrigin(a.getWidth()/2, a.getHeight()/2); 
+0

To było najprostsze rozwiązanie. Właśnie ustalam pochodzenie wewnątrz aktora w metodzie roll_onto_screen(). Dzięki chłopaki! –

+0

Co się stanie, jeśli będę musiał ciągle obracać aktora lub grupę? – ManishSB

+0

Po prostu obróć rotateAction do repeatAction niż i ustaw repeatAction jako Action Action. – Kedu

3

Najprostszym sposobem jest przetłumaczyć obiekt, tak aby punkt 0,0 był środkiem, obrócić go, a następnie przełożyć z powrotem na pozycję. Nie jestem zaznajomiony z libGDX, ale powinna istnieć metoda agregowania trzech transformacji, co oznacza, że ​​do obiektu jest stosowana tylko jedna zagregowana transformacja. Pamiętaj, że kolejność agregowania transformacji ma znaczenie.

O wiele bardziej skomplikowany sposób, który daje dokładnie taki sam wynik, polega na obliczeniu ilości przesunięcia utworzonego przez obrót i przeniesieniu obrazu z powrotem na jego pochodzenie. Nie rób tego w ten sposób. Łączenie trzech prostych transformacji jest drogą do osiągnięcia i jednym z najlepszych powodów zastosowania transformacji.

** Edytuj Patrząc na API obiekt Aktor ma metodę translate(). Użyj tego, aby przesunąć obraz, aby punkt 0,0 znajdował się pośrodku. W psuedokode;

x = this.getX(); 
y = this.getY(); 
cx = this.getWidth() * .5; 
cy = this.getHeight() * .5; 
this.translate(-(x+cx), -(y+cy)); // move so 0,0 is the centre of the Actor object 
this.rotate(thisMuch); // rotate the Actor 
this.translate((x+cx), (y+cy)); // move it back to its original location 

Spowoduje to obrót obiektu w jego punkcie centralnym na miejscu. Wygląda na zawiłe, ale jest dość efektywne w praktyce, bardziej jeśli jesteś w stanie pracować bezpośrednio z macierzami (transformacjami), które będą napędzać te metody.

+0

Metoda moveTo (320, 100, 0.5f) służy do przesunięcia obrazu do punktu x = 320 y = 100 na mapie. Nie sądzę, żebym rozumiał, jak bym ** przetłumaczył obiekt **. –

+0

Mając na uwadze, to moje pierwsze spojrzenie na libGDX :-) Zmieniam swoją odpowiedź powyżej. –

3

Oto prosty sposób, w jaki sposób można obrócić aktor w libgdx.

Najpierw trzeba ustawić pochodzenia:

img.setorigin(width/2,hieght/2); 

Teraz można obracać w prawo i lewo, w zależności od potrzeb:

img.rotate(2f); 

lub

img.rotate(-2f); 
2

Najprostszym a najkrótszym sposobem na ustalenie pochodzenia jest wywołanie:

Actor a; 

... 

a.setOrigin(Align.center);