2012-02-25 56 views
5

¿Cómo podemos rotar una imagen en el sentido de las agujas del reloj con LibGDX? lo que estoy buscando es cuando una imagen está cargada, supongamos una estrella, necesito rotarla desde el principio de la pantalla hasta el final de la pantalla horizontalmente, con la estrella girando, ¿cómo puedo hacer eso en libgdx?Girar la imagen en el sentido de las agujas del reloj con LibGDX

+0

Su pregunta no es muy clara. ¿Estás rotando una Textura, Sprite o Imagen? Al "rotarlo desde el principio de la pantalla hasta el final de la pantalla horizontalmente, con la rotación de la estrella", ¿quiere decir que quiere que la estrella se mueva horizontalmente mientras gira? –

+0

@RahatAhmed: lo siento, estoy teniendo una textura, sí, necesito que gire mientras me muevo horizontalmente –

Respuesta

10

Al dibujar la textura con su SpriteBatch, puede utilizar una de las funciones de dibujo que incluye la rotación. Este javadoc tiene todas las funciones de dibujar: SpriteBatch

Puede mantener una variable de posición y rotación, y aumentar la rotación y el componente x de la posición cada vez que renderiza para hacerla girar mientras se mueve horizontalmente.

3

siguiente es la aplicación para girar cualquier sprites

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 --; 

Inicialmente establecido en contra de

private float count =360.0f; 
0

Puede hacerlo también así:

en su creación método

sprite.setOrigin(sprite.getWitdh() /2f, sprite.getHeight() /2f); 
sprite.setPosition(0, 200); //200 it's a example 

en su render (delta flotación)

sprite.setX(sprite.getX() + delta).setRotation(sprite.getRotation() + delta); 
1

Para girar hacia la izquierda y horizontalmente .. crear un textureRegion continuación

Sprite sprite = new Sprite(textureRegion, 0, 0, 128, 128); 
sprite.setPosition(++mX, 0); 
angle++; 
sprite.setRotation(angle); 
sprite.draw(batcher); 
3

libgdx le da más de una manera de hacer eso : Puede usar Scene2D y agregar Image a su Stage. Image es una subclase de Actor, lo que puede añadir Action s a ella:

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); 

En render a continuación, puede llamar stage.act(), que actualiza la posición, rotación, escala ... de todos sus Actor s y luego llamar stage.draw() que llamará draw() para todos sus Actor s. La imagen ya se ocupa del draw() por lo que ya no necesita preocuparse por eso.

También puede hacerlo sin scene2d, mediante la actualización de todo usted mismo:
Puede almacenar un int rotationSpeed en grados/seg
Usted puede almacenar un int moveSpeed en unidades/seg (tal vez de píxeles pero sugeriría a utilizar la cámara o visor y utilizar su propia unidad, que es igual en todos los dispositivos)
tienda del float angle, que es la rotación actual de su Texture y almacenar un Vector2 position, que contiene la posición x e y de su Texture.
Si desea moverse en dirección xey, también puede almacenar un Vector2 direction, que es un Vector normalizado, dando el porcentaje de movimiento en dirección xey, pero esa es una historia diferente.

Luego, en su render(float delta) actualizar todo:

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); 

Para la rotación de las agujas del reloj sólo tiene que utilizar un negativo rotationSpeed o reemplazar el angle+= con angle-=.

Espero que ayude.

0

Aquí hay un sencillo para rotar a un actor en libgdx. En primer lugar es necesario establecer el origen:

img.setOrigin(getWidth/2,getHeight/2); 

Y entonces se puede girar en sentido horario y antihorario según su necesidad:

img.rotate(2f); or img.rotate(-2f); 
0

Así que el siguiente ejemplo trabajó para mí (rotación infinita)

Método 1: (recomendado)

loadingActor.addAction(Actions.repeat(RepeatAction.FOREVER, Actions.rotateBy(360, 1))); 

Método 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)); 
Cuestiones relacionadas