Вращение спрайтов в Android с использованием Canvas.DrawBitmap. Я близок, что я делаю не так?

У меня есть этот алгоритм вращения спрайтов (он плохо назван и просто используется для тестирования) Он настолько близок, что нарисованные им спрайты вращаются. К каждому кадру я могу добавить +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

}  

Итак, он это делает, вещи после вызова вращательного рисования отрисовываются правильно. Но проблема в том, что это мерцает. Теперь можно сказать, что я должен просто сделать все, что не вращаюсь, и сохранить это последним, но зордеринг был бы отключен .... предложения относительно того, как решить эту проблему с зордерингом или мерцанием?

7
задан Codejoy 30 August 2010 в 14:21
поделиться