Come è possibile ruotare un'immagine in senso orario utilizzando LibGDX? quello che sto cercando è quando un'immagine viene caricata, supponiamo una stella, ho bisogno di ruotarla dall'inizio alla fine dello schermo in orizzontale, con la stella che gira, come posso farlo in libgdx?Ruota immagine in senso orario utilizzando LibGDX
risposta
Quando si disegna la Texture con SpriteBatch, è possibile utilizzare una delle funzioni di disegno che include la rotazione. Questo javadoc ha tutte le funzioni di disegno: SpriteBatch
È possibile mantenere una variabile per la posizione e la rotazione, e aumentare la componente di rotazione e x della posizione ogni volta che si esegue il rendering per farlo ruotare mentre si muove in senso orizzontale.
È inoltre possibile utilizzare le azioni Scene2D. Ho qui un esempio con oggetti di tipo asteroide che cadono dallo schermo e ruotano.
http://www.netthreads.co.uk/2012/02/09/libgdx-scene2d-demo-with-scene-transitions/
In seguito è l'implementazione di ruotare qualsiasi sprite
batch.draw(sprite,(Gdx.graphics.getWidth() - sprite.getRegionWidth())/2.0f,(Gdx.graphics.getHeight() - sprite.getRegionHeight())/2.0f,sprite.getRegionWidth()/2.0f,sprite.getRegionHeight()/2.0f, sprite.getRegionWidth(), sprite.getRegionHeight(), 1f, 1f,count, false);
if(count < 0.0f)
count = 360.0f;
else
count --;
Inizialmente impostare contatore
private float count =360.0f;
È possibile farlo anche in questo modo:
sul tuo creare metodo
sprite.setOrigin(sprite.getWitdh() /2f, sprite.getHeight() /2f);
sprite.setPosition(0, 200); //200 it's a example
sul render (delta float)
sprite.setX(sprite.getX() + delta).setRotation(sprite.getRotation() + delta);
Per ruotare in senso antiorario e in senso orizzontale .. creare un textureRegion poi
Sprite sprite = new Sprite(textureRegion, 0, 0, 128, 128);
sprite.setPosition(++mX, 0);
angle++;
sprite.setRotation(angle);
sprite.draw(batcher);
Libgdx ti dà più di un modo per farlo : È possibile utilizzare Scene2D
e aggiungere uno Image
al numero Stage
. Image
è una sottoclasse di Actor
, in modo da poter aggiungere Action
s ad esso:
Image myImage = new Image(myTexture);
myImage.addAction(Actions.parallel(Actions.moveTo(endX, endY, duration), Actions.rotateBy(degrees, duration)));
myImage.setPosition(startX, startY);
myImage.setOrigin(sizeX/2, sizeY/2);
stage.add(myImage);
In render
si può quindi chiamare stage.act()
, che aggiorna la posizione, rotazione, scala ... di tutte le vostre Actor
s e quindi chiamare stage.draw()
che chiamerà draw()
per tutti i tuoi Actor
s. Image allready gestisce lo draw()
quindi non è più necessario preoccuparsene.
È anche possibile farlo senza scene2d
, aggiornando tutto da soli:
È possibile memorizzare un int rotationSpeed
in gradi/sec
È possibile memorizzare un int moveSpeed
in unità/sec (forse pixel, ma vorrei suggerire di utilizzare fotocamera o finestra e usa la propria unità, che è uguale su tutti i dispositivi)
Conservare il float angle
, che è la rotazione attuale del Texture
e memorizzare un Vector2 position
, che contiene la posizione xey del Texture
.
Se si desidera spostare in direzione xey si può anche memorizzare un Vector2 direction
, che è un normalizzato Vector
, dando la percentuale di movimento in direzione xey, ma questa è una storia diversa.
Poi, nel tuo render(float delta)
si aggiorna tutto:
angle+=delta*rotationSpeed;
angl%=360; // Limits the angle to be <= 360
while (angle < 0) // Unfortunally the "modulo" in java gives negative result for negativ values.
angle+=360;
position.x+=direction.x*moveSpeed*delta;
position.y+=direction.y*movSpeed*delta;
spriteBatch.draw(yourTextureRegion, position.x, position.y, sizeX/2, sizeY/2, sizeX, sizeY, scaleX, scaleY, angle);
Per rotazione in senso orario è sufficiente utilizzare un negativo rotationSpeed
o sostituire la angle+=
con angle-=
.
Spero che aiuti.
Ecco un semplice per ruotare un attore in libgdx. Prima di tutto bisogna impostare l'origine:
img.setOrigin(getWidth/2,getHeight/2);
E allora si può ruotare in senso orario e antiorario secondo le vostre necessità:
img.rotate(2f); or img.rotate(-2f);
Così il seguente esempio ha lavorato per me (rotazione infinita)
Metodo 1: (consigliato)
loadingActor.addAction(Actions.repeat(RepeatAction.FOREVER, Actions.rotateBy(360, 1)));
Metodo 2:
Image loadingActor = new Image(AssetsController.getInstance().getLoading());
loadingActor.setOrigin(Align.center);
final SequenceAction infiniteRotate = Actions.sequence();
infiniteRotate.addAction(Actions.rotateTo(0 , 0f));
infiniteRotate.addAction(Actions.rotateTo(360 , 1f));
loadingActor.addAction(Actions.forever(infiniteRotate));
La tua domanda non è molto chiaro. Stai ruotando una Texture, Sprite o Immagine? Per "ruotarlo orizzontalmente dall'inizio alla fine dello schermo, con la stella che ruota" intendi che vuoi che la stella si muova orizzontalmente mentre ruota? –
@RahatAhmed: mi dispiace, sto avendo una texture, sì.io ne ho bisogno per essere ruotato mentre si muove orizzontalmente –