J'ai besoin de supprimer une animation rapide en C #/Windows Forms pour un affichage Halloween. Juste quelques formes 2D se déplaçant sur un fond uni. Étant donné qu'il ne s'agit que d'un projet ponctuel rapide, je vraiment je ne veux pas installer et apprendre un nouvel ensemble complet de outils pour cela. (Kits de développement DirectX, Silverlight, Flash, etc.). Je dois également l'installer sur plusieurs ordinateurs, donc tout ce qui dépasse le cadre de base .Net (2.0) serait une douleur dans le cul.
Pour les outils, j'ai VS2k8, 25 ans d'expérience en développement, une brouette, une cape d'holocauste et environ 2 jours pour l'assommer. Je n'ai pas fait d'animation depuis que j'utilise l'assembleur sur mon Atari 130XE (hourra pour le retournement de page et les graphiques de joueur/missile!)
Conseil? Voici certaines des choses que j'aimerais savoir:
Merci.
Post Mortem Edit ... "quelques jours de codage plus tard"
Eh bien, le projet est terminé. Les liens ci-dessous ont été utiles bien que deux d'entre eux étaient 404. (Je souhaite SO permettrait à plus d'une réponse d'être marquée "correcte"). Le plus gros problème que j'ai dû surmonter était le scintillement et un bogue persistant lorsque j'ai essayé de dessiner directement sur le formulaire.
La définition de toutes les options de "double mise en mémoire tampon" sur le formulaire laissait encore un certain scintillement qui devait être corrigé. (Et j'ai trouvé des documents contradictoires qui disaient "les mettre sur le contrôle" et "les mettre sur le formulaire". Eh bien, les contrôles n'ont pas de méthode .SetStyle ().) Je n'ai pas testé sans eux, donc ils pourraient être faire quelque chose (this
est le formulaire):
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Ainsi, le cheval de bataille du code a fini par ressembler à (pf
est le panneau de contrôle):
void PaintPlayField()
{
Bitmap bufl = new Bitmap(pf.Width, pf.Height);
using (Graphics g = Graphics.FromImage(bufl))
{
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pf.Width, pf.Height));
DrawItems(g);
DrawMoreItems(g);
pf.CreateGraphics().DrawImageUnscaled(bufl, 0, 0);
}
}
Et je viens d'appeler PaintPlayField de l'intérieur de ma boucle Timer. Pas de scintillement du tout.
Déclenchez une minuterie à la fréquence d'images souhaitée. À chaque minuterie de tir, tordez la représentation interne des formes à l'écran (votre modèle) par le mouvement d'animation que vous souhaitez réaliser, puis appelez Invalidate(true)
. À l'intérieur d'OnPaint, dessinez simplement le modèle sur l'écran.
Oh ouais, et vous voulez probablement activer la double mise en mémoire tampon (c'est comme le retournement de page automatique).
Animation basée sur la minuterie
Ces deux exemples donnent de bons exemples d'animation. Le code est assez simple. je les ai utilisés lorsque j'avais besoin de faire une animation rapide pour mon fils.