我有这种精灵旋转算法(它的命名很差,只是用于测试)。它是如此接近,用它绘制的精灵旋转。每一帧我都可以加上+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或闪烁的问题?
答案 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,将画布恢复到上次保存的点。否则,您的所有更改都会累积起来并导致意外结果。