使用Canvas.DrawBitmap在Android中进行Sprite旋转。我很接近,我做错了什么?

时间:2010-08-27 19:48:21

标签: android rotation sprite

我有这种精灵旋转算法(它的命名很差,只是用于测试)。它是如此接近,用它绘制的精灵旋转。每一帧我都可以加上+5度,看到我漂亮的小精灵旋转。问题是,画布上绘制的其他东西现在都在闪烁。如果我不进行旋转,则常规绘制的精灵效果很好。我想我很接近,但我不知道我错过了什么。下面是我的两个“Draw_Sprite”方法,一个只是将先前资源加载的位图绘制到传入的画布中。另一个,做了一些最好的旋转我知道如何旋转精灵这么多x度...然后绘制它。如果我有一个很好的游戏循环来绘制几个对象,一种类型是旋转的类型。然后非旋转的精灵闪烁,但旋转的精灵永远不会闪烁。虽然如果我首先绘制非旋转的精灵,一切都很好,但是Z-Ordering可能会混乱(UI元素顶部的精灵等)......方法定义:

    /*************************************************
 * rotated sprite, ignore the whatever, its for ease of use and testing to have this argument list
 * @param c canvas to draw on.
 * @param whatever ignore 
 * @param rot degrees to rotate
 * @return
 */
public int Draw_Sprite(Canvas c, int whatever, int rot) {   
    //rotating sprite
    Rect src = new Rect(0, 0, width, height);
    Rect dst = new Rect(x, y, x + width, y + height);
    Matrix orig = c.getMatrix();        
    mMatrix = orig;
    orig.setTranslate(0, 0);
    orig.postRotate(rot, x+width/2, y+height/2); 
    c.setMatrix(orig);
    c.drawBitmap(images[curr_frame], src, dst, null);
    c.setMatrix(mMatrix); //set it back so all things afterwards are displayed correctly.

    isScaled=false;
    return 1;

}

/********************************************************
 * draw a regular sprite to canvas c
 * @param c
 * @return
 */
public int Draw_Sprite(Canvas c) {  

    Rect src = new Rect(0, 0, width, height);
    Rect dst = new Rect(x, y, x + width, y + height);       
    c.drawBitmap(images[curr_frame], src, dst, null);

    isScaled=false;
    return 1;
}

现在用法:

void onDraw(Canvas c)
{
    canvas.drawRect( bgRect, bgPaint); //draw the background

    //draw all game objects
      // draw the normal items
    for (GameEntity graphic : _graphics) { 
        graphic.toScreenCoords((int)player_x, (int)player_y);
        if(graphic.getType().equals("planet")) //draw planets
            graphic.Draw_Sprite(canvas); //before the rotation call draws fine
        else
        {
            //rotate all space ships every frame so i see them spinning        
            //test rotation
            mRot +=5;
            if(mRot>=360)
                mRot=0;
            graphic.Draw_Sprite(canvas, 0, mRot); //yes function name will be better in future.  this rotates spins draws fine


        }                           
       }

       thePlayer.Draw_Sprite(canvas); //FLICKERS
       drawUI(canvas);//all things here flickr

}  

所以它确实这样做了,在调用旋转绘图之后的事情被正确绘制。但问题是它是闪烁的。现在有人可以说我应该做我所有的非旋转的东西,并保存最后,但zordering将关闭....建议如何解决这个zordering或闪烁的问题?

2 个答案:

答案 0 :(得分:15)

只为下一个可能会读到此内容的人。您只需几行代码即可完成此操作:

canvas.save();
canvas.rotate(rotation_angle, x + (widthofimage / 2), y + (heightofimage / 2));
canvas.drawBitmap(bitmap, x, y, null);
canvas.restore();

答案 1 :(得分:8)

在旋转之前尝试使用canvas.save(),在操作完成后尝试使用canvas.restore()。

当在画布上执行操作以改变绘制对象的方式时,你必须记住操作设置画布如何处理原点等...所以如果你翻译或旋转画布,那么将设​​置为画布的寿命。为了避免这种情况,首先调用save,在操作之前保存canvas矩阵的快照,然后运行所有更改,然后调用restore,将画布恢复到上次保存的点。否则,您的所有更改都会累积起来并导致意外结果。