У меня есть этот алгоритм вращения спрайтов (он плохо назван и просто используется для тестирования) Он настолько близок, что нарисованные им спрайты вращаются. К каждому кадру я могу добавить +5 градусов и увидеть, как мой милый маленький спрайт вращается. Проблема в том, что другие элементы, нарисованные на холсте, теперь мерцают. Если я не выполняю вращение, обычные нарисованные спрайты отлично работают. Я думаю, что близок, но я просто не знаю, что мне не хватает. Ниже приведены два моих метода «Draw_Sprite», один просто рисует ранее загруженное растровое изображение на переданный холст. Другой, делает какое-то вращение, насколько я знаю, как повернуть спрайт на столько градусов ... и затем нарисовать его . Если у меня есть хороший игровой цикл, который рисует несколько объектов, один тип - это повернутый. Затем не повернутые спрайты мерцают, а повернутый спрайт никогда не мерцает. Хотя, если я сначала нарисую не повернутые спрайты, все будет хорошо, но тогда Z-порядок может быть испорчен (спрайты поверх элементов пользовательского интерфейса и т. Д.) ... Определения метода:
/*************************************************
* 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
}
Итак, он это делает, вещи после вызова вращательного рисования отрисовываются правильно. Но проблема в том, что это мерцает. Теперь можно сказать, что я должен просто сделать все, что не вращаюсь, и сохранить это последним, но зордеринг был бы отключен .... предложения относительно того, как решить эту проблему с зордерингом или мерцанием?