2012-12-17 4 views
18

Se ho capito bene, LibGDX sta ruotando un'immagine con l'uso del metodo addActions:Come ruotare un attore dell'immagine in libgdx dal punto centrale?

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

Il fatto è che è in rotazione dal punto = (0,0) dell'immagine.

ecco la mia domanda:

Esiste un modo per ruotare un'immagine dal punto centrale dell'oggetto? Qualcosa come bloccarlo nel mezzo e poi girarlo come una ruota in una macchina? Entrambi rotateBy e rotateTo metodi trasformano il (0,0) punto dell'immagine stessa.

risposta

29

Devi impostare correttamente "l'origine" del tuo attore. È possibile leggere dall'API attore che l'origine è relativa alla posizione e viene utilizzata per la scala e la rotazione.

Quindi, calcolare il punto medio e impostare l'origine sul punto centrale.

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

Questa era la soluzione più semplice. Sto solo impostando l'origine all'interno dell'Actor nel metodo roll_onto_screen(). Grazie ragazzi! –

+0

Cosa succede se devo ruotare continuamente un attore o un gruppo? – ManishSB

+0

Basta ruotare l'azione rotateAction in repeatAction rispetto a, e impostare repeatAction come action degli attori. – Kedu

3

Il modo più semplice è tradurre l'oggetto in modo che il punto 0,0 sia il centro, ruotarlo e quindi riportarlo in posizione. Non ho familiarità con libGDX, ma dovrebbe esserci un metodo per aggregare le tre trasformazioni, il che significa che si applica solo l'unica trasformazione aggregata al proprio oggetto. Tieni presente l'ordine con cui aggreghi le trasformazioni, fa la differenza.

Un modo molto più complicato che dà esattamente lo stesso risultato comporta il calcolo della quantità di scostamento creata dalla rotazione e la conversione dell'immagine alla sua origine. Non farlo in questo modo. Combinare tre semplici trasformazioni è la strada da seguire e uno dei migliori motivi per utilizzare le trasformazioni.

** Modifica Guardando il API l'oggetto attore ha un metodo translate(). Usare questo per spostare l'immagine in modo che il punto 0,0 sia al centro. In psuedocode;

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 

In questo modo l'oggetto ruoterà sul suo punto centrale, sul posto. Sembra complicato, ma è abbastanza efficiente in pratica, a maggior ragione se sei in grado di lavorare direttamente con le matrici (trasformazioni) che guideranno questi metodi.

+0

il metodo moveTo (320, 100, 0.5f) viene utilizzato per spostare l'immagine al punto x = 320 y = 100 sulla mappa. Non penso di capire come potrei ** tradurre l'oggetto **. –

+0

Tenendo presente, questo è il mio primo sguardo a libGDX :-) Sto modificando la mia risposta sopra. –

3

Ecco come si può ruotare un attore in libgdx.

In primo luogo, è necessario impostare l'origine:

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

Ora è possibile ruotare in senso orario e antiorario, secondo le vostre necessità:

img.rotate(2f); 

o

img.rotate(-2f); 
2

Il metodo più semplice e il modo più breve che ho trovato per impostare l'origine è chiamare:

Actor a; 

... 

a.setOrigin(Align.center);