2012-06-25 18 views
5

Estoy luchando por dibujar un mapa de bits giratorio alrededor de su centro y hacer la rotación sin cambiar el tamaño del mapa de bits. Estoy dibujando todos mis sprites en la pantalla mediante un hilo de juego, por lo que estoy buscando una solución que incorpore el mapa de bits original y no el lienzo.Android gira el mapa de bits alrededor del centro sin cambiar el tamaño

Gracias de antemano.

Este es mi código hasta ahora, convierte un mapa de bits en su centro, pero lo cambia de tamaño.

i = i + 2; 
      transform.postRotate(i, Assets.scoresScreen_LevelStar.getWidth()/2, Assets.scoresScreen_LevelStar.getHeight()/2); 
      Bitmap resizedBitmap = Bitmap.createBitmap(Assets.scoresScreen_LevelStar, 0, 0, Assets.scoresScreen_LevelStar.getWidth(), Assets.scoresScreen_LevelStar.getHeight(), transform, true); 

      game.getGraphics().getCanvasGameScreen().drawBitmap(resizedBitmap, null, this.levelStar.getHolderPolygons().get(0), null); 

Actualización:

me he dado cuenta de que esto no es tan fácil como suena. Mi código de rotación no es el problema. El mapa de bits gira, sin embargo, el dst recto también tendrá que aumentar/disminuir dependiendo del ángulo de rotación, de lo contrario el bimap aparecerá más pequeño, ya que se dibuja en un dst recto fijo. Así que supongo que tendré que desarrollar algún método que me devuelva un dst recto. Así los métodos necesarios para hacer girar un mapa de bits sin cambiar el tamaño aparecían:

public static Bitmap rotateBitmap(Bitmap bitmap, int rotation) // I've got this method working 

y

public static Rect rotateRect(Rect currentDst, int rotation) // Don't got this 

entiendo esto requerirá un poco de matemática (trig), cualquiera preparado para el reto? : P

+0

¿Qué has intentado hasta ahora? ¿Puedes publicar algunos ejemplos de lo que no funcionó para ti? –

+0

Straight Android o Cocos2d-x? – Fallenreaper

+0

Pregunta actualizada con el código, @Fallenreaper, estoy usando mi propio GE, tan directamente Android. –

Respuesta

0

Esto funcionó para mí!

Creé un método que devuelve una matriz. La matriz se puede utilizar en el siguiente método de dibujo:

public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint) 

¡Aquí tienes! (La forma parámetro puede ser reemplazado con facilidad, si le gustaría que, simplemente dejar un comentario):

public static Matrix rotateMatrix(Bitmap bitmap, Shape shape, int rotation) { 

     float scaleWidth = ((float) shape.getWidth())/bitmap.getWidth(); 
     float scaleHeight = ((float) shape.getHeight())/bitmap.getHeight(); 

     Matrix rotateMatrix = new Matrix(); 
     rotateMatrix.postScale(scaleWidth, scaleHeight); 
     rotateMatrix.postRotate(rotation, shape.getWidth()/2, shape.getHeight()/2); 
     rotateMatrix.postTranslate(shape.getX(), shape.getY()); 


     return rotateMatrix; 

    } 

Nota: Si desea una rotación de animación, el parámetro de rotación tendrá que ser actualizado con los nuevos valores de cada marco por ejemplo. 1 luego 2 luego 3 ...

7

Debe dibujar el mapa de bits utilizando la clase Matrix. A continuación se muestra una idea muy básica, suponiendo que desea rotar una imagen dentro de una clase "Enviar". Actualizas la posición actual de Matrix dentro del método de actualización. En onDraw() dibuja el mapa de bits usando la posición recientemente actualizada Matriz. Esto dibujará el mapa de bits girado sin redimensionarlo.

public class Ship extends View { 

    private float x, y; 
    private int rotation; 
    private Matrix position;  
    private Bitmap bitmap; 

    ... 

    @Override 
    public void onDraw(Canvas canvas) { 
     // Draw the Bitmap using the current position 
     canvas.drawBitmap(bitmap, position, null); 
    } 

    public void update() { 
     // Generate a new matrix based off of the current rotation and x and y coordinates. 
     Matrix m = new Matrix(); 
     m.postRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2); 
     m.postTranslate(x, y); 

     // Set the current position to the updated rotation 
     position.set(m); 

     rotation += 2; 
    } 

    .... 

} 

Hope that helps!

También tenga en cuenta que la generación de un nuevo objeto Bitmap dentro de su bucle de juego requerirá muchos recursos.

+0

¿Podría escribir de nuevo, que puedo llamar a un método estático llamado rotateBitmap (mapa de bits bitmap, rotación int), que devolverá un objeto Bimap rotado con Bitmap? –

+0

el método cambia el mapa de bits que pasa, por lo que su variable privada "mapa de bits de mapa de bits privado;" no está giradoSimplemente haz "return bitmap"; y cambie la firma del método. – Aziz

+0

Lo siento, esto no funciona para mí. –

Cuestiones relacionadas