Sprite de la Rotation dans l'Android à l'aide de la Toile.DrawBitmap. Je suis proche, ce que je fais mal?
J'ai ce sprite de rotation de l'algorithme de son mal nommée et juste utilisé pour les tests). Il est si proche, les sprites dessinés avec, il ne pivotent pas. Everyframe je peux ajouter +5 ° à elle et voir mon joli petit sprite tourner autour. Le problème est, les autres trucs tirés de la toile maintenant scintille. Si je ne fais pas la rotation régulière attiré les sprites de l'excellent travail. Je pense que je suis proche, mais je ne sais pas ce morceau, je suis absent. Ci-dessous mes deux "Draw_Sprite" méthodes, on attire tout le déjà des ressources bitmap chargée de la toile. De l'autre, du fait de la rotation de la meilleure, je ne sais comment tourner le sprite par x nombre de degrés..et puis de dessiner. Si j'ai une belle boucle de jeu qui attire plusieurs objets, un type est la rotation de genre. Ensuite, la non-rotation des sprites de scintillement et pourtant, la rotation de sprite ne le fait jamais. Mais si je tire la non-rotation des sprites tout d'abord, tout va bien, mais ensuite le Z-Commande pourrait être foiré (sprites sur le dessus des éléments de l'INTERFACE utilisateur, etc)... La méthode définitions:
/*************************************************
* 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;
}
Et maintenant l'utilisation:
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
}
De sorte à ne faire, que les choses après un appel à un mouvement de rotation de tirage au sort sont dessinés correctement. Mais le problème est qu'il flickrs. Maintenant, On pourrait dire que je devrais juste faire tous mes non rotation des trucs et sauver le dernier, mais le zordering serait désactivé.... des suggestions quant à la façon de s'attaquer à ce problème de zordering ou le scintillement?
OriginalL'auteur Codejoy | 2010-08-27
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser de la toile.save() avant la rotation et de la toile.restore() après la manipulation est terminée.
Lors de l'exécution de manipulations sur la toile, afin de changer la façon dont un objet est dessiné vous devez vous rappeler les manipulations de définir la façon dont la toile poignées d'origines, etc... Donc si vous le traduire ou de faire pivoter la toile, qui sera fixé pour la durée de vie de la toile. Afin d'éviter cela, vous appeler en premier save, qui enregistre un instantané de la toile de la matrice avant de vous manipuler, vous exécutez toutes vos modifications, puis d'appeler la restauration qui permettra de rétablir la toile de retour à la dernière version enregistrée de point. Sinon tous vos changements de construire et vous obtenez des résultats inattendus.
Viens de tomber sur ça hier. Avait une hypothèse tout à fait tort avec la façon dont la toile poignées de manipulations. Heureux que j'ai appris la bonne façon! 🙂
OriginalL'auteur methodin
Juste pour le gars à côté qui peut lire ce qui suit. Vous pouvez le faire avec seulement quelques lignes de code:
OriginalL'auteur JP_