2011-05-14 13 views
5

Mi aplicación activa instancias de sprites alrededor de un lienzo que luego se desplazan por la pantalla hacia una coordenada x/y. Me gustaría poder rotar el sprite alrededor de su centro para que quede frente a sus coordenadas de destino. Estoy usando una hoja de sprite y he tenido problemas con el recorte. También encontré muchos buenos ejemplos, pero nada parece cubrir exactamente lo que estoy buscando. This example is very close pero por eficiencia estoy usando una clase ImagePooler y no puedo volver a cargar una imagen en cada sorteo/rotación. Entonces, si alguien tuviera una idea sobre cómo rotar la imagen precargada sin cortar mi hoja de sprites, estaría muy agradecido.Android: Cómo rotar un sprite animado en movimiento basado en las coordenadas de su destino

Respuesta

13

En primer lugar, es fácil de rotar un sprite puede utilizar tela o matriz:

Matrix matrix = new Matrix(); 
matrix.postRotate(angle, (ballW/2), (ballH/2)); //rotate it 
matrix.postTranslate(X, Y); //move it into x, y position 
canvas.drawBitmap(ball, matrix, null); //draw the ball with the applied matrix 

// method two 
canvas.save(); //save the position of the canvas 
canvas.rotate(angle, X + (ballW/2), Y + (ballH/2)); //rotate the canvas' matrix 
canvas.drawBitmap(ball, X, Y, null); //draw the ball on the "rotated" canvas 
canvas.restore(); //rotate the canvas' matrix back 
//in the second method only the ball was roteded not the entire canvas 

Para activar la directa hacia un destino que necesita saber el ángulo entre el sprite y el destino:

spriteToDestAngle = Math.toDegrees(Math.atan2((spriteX - destX)/(spriteY - destY))); 

Ahora todo lo que tiene que hacer es usar este ángulo para la rotación de los sprites y ajústelo con un ángulo constante como ShiftShift que depende de dónde apunte inicialmente su sprite.

No estoy seguro de si esto va a funcionar, pero espero que le puede dar algunas ideas ...

+0

Cada uno de mis sprites tiene sus propios métodos de dibujo donde utilizo un objeto Rectangle para sacar la parte de la hoja de sprites que quiero dibujar, por lo que la opción Matrix parece estar fuera de la questio n (aunque por alguna razón creo que esa es la elección que preferiría). El método Canvas, sin embargo, está funcionando (casi) exactamente como esperaba y con un pequeño ajuste en su código spriteToDestAngle tendré lo que estoy buscando. – bwags

+0

Me alegro de que haya sido útil :) – Lumis

0

usando this referance para calcular Ángulo:

private double angleFromCoordinate(double lat1, double long1, double lat2, 
     double long2) { 

    double dLon = (long2 - long1); 

    double y = Math.sin(dLon) * Math.cos(lat2); 
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) 
      * Math.cos(lat2) * Math.cos(dLon); 

    double brng = Math.atan2(y, x); 

    brng = Math.toDegrees(brng); 
    brng = (brng + 360) % 360; 
    brng = 360 - brng; 

    return brng; 
} 

y luego gire ImageView a este ángulo

private void rotateImage(ImageView imageView, double angle) { 

    Matrix matrix = new Matrix(); 
    imageView.setScaleType(ScaleType.MATRIX); // required 
    matrix.postRotate((float) angle, imageView.getDrawable().getBounds() 
      .width()/2, imageView.getDrawable().getBounds().height()/2); 
    imageView.setImageMatrix(matrix); 
} 
Cuestiones relacionadas