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?
że całkowicie to zrobił ... wow – Codejoy
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