2010-08-27 12 views
7

Mam ten algorytm obracania sprite (jego słabo nazwany i właśnie używany do testowania). Jest tak blisko, że sprite narysowane z nim obracają się. Wszystko co mogę dodać +5 stopni do niego i zobaczyć mój miły mały sprite obracający się wokół. Problem w tym, że inne rzeczy narysowane na płótnie migoczą teraz. Jeśli nie wykonuję obrotu, zwykłe wyrysowane duszki działają świetnie. Myślę, że jestem blisko, ale po prostu nie wiem, jakiego kawałka mi brakuje. Poniżej znajdują się moje dwie metody "Draw_Sprite", po prostu rysuje poprzednio załadowaną zasobami bitmapę do przesłanego płótna. Drugi, robi rotację najlepiej, jak wiem, jak obrócić duszek o tak wiele stopni ... a następnie narysuj . Jeśli mam fajną pętlę do gry, która rysuje kilka obiektów, jeden typ jest obracany. Wtedy nieobracające się duszki migoczą, a obracany sprite nigdy tego nie robi. Choć jeśli rysuję nie obróconej ikonek pierwsze, wszystko jest dobrze, ale potem Z-Kolejność może być pomieszane (ikonek na górze elementów UI etc) ... definicje metoda:Rotacja Sprite w Androidzie przy użyciu Canvas.DrawBitmap. Jestem blisko, co robię źle?

/************************************************* 
* 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; 
} 

I teraz użycie:

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 

} 

Tak robi, rzeczy po wywołaniu do losowania rotacyjnego są rysowane poprawnie. Ale problem polega na tym, że to flickrs. Teraz można powiedzieć, że powinienem zrobić wszystkie moje nie rotacyjne rzeczy i zachować to ostatnie, ale zarodkowanie będzie wyłączone .... sugestie, jak rozwiązać ten problem z zordering lub migotanie?

Odpowiedz

8

Spróbuj użyć canvas.save() przed obróceniem i canvas.restore() po zakończeniu manipulacji.

Podczas wykonywania manipulacji na płótnie, aby zmienić sposób rysowania obiektu, należy pamiętać, że manipulacje określają sposób, w jaki płótno obsługuje pochodzenie itp. ... Jeśli przetłumaczysz lub obrócisz płótno, które zostanie ustawione dla życie tego płótna. Aby tego uniknąć, najpierw wywołaj save, który zapisuje migawkę macierzy canvas przed jej manipulowaniem, następnie uruchom wszystkie zmiany, a następnie wywołaj restore, który przywróci płótno z powrotem do ostatniego zapisanego punktu. W przeciwnym razie wszystkie twoje zmiany będą się narastać i uzyskasz niezamierzone wyniki.

+0

że całkowicie to zrobił ... wow – Codejoy

+0

prostu zabrakło do tego wczoraj. Miał całkowicie błędne założenie, jak płótno radzi sobie z manipulacjami. Cieszę się, że nauczyłem się właściwej drogi! :) – methodin

15

Tylko dla następnego faceta, który może to przeczytać. Można to zrobić za pomocą kilku linijek kodu:

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