web-dev-qa-db-fra.com

Animation simple à l'aide de C # / Windows Forms

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:

  • Je peux dessiner sur n'importe quel widget vide (comme un panneau) en jouant avec son gestionnaire OnPaint, non? Voilà comment je dessinais un widget personnalisé. Existe-t-il une meilleure technique que celle-ci?
  • Existe-t-il une technique de retournement de page pour ce genre de chose dans Windows Forms? Je ne recherche pas une fréquence d'images élevée, aussi peu de scintillement/dessin que nécessaire.

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.

  • Utilisation de l'événement OnPaint pour le formulaire: mauvaise idée. Je n'ai jamais réussi à faire ça; beaucoup d'erreurs mystérieuses (débordements de pile ou ArgumentNullExceptions). Je me suis retrouvé en utilisant un panneau dimensionné pour remplir le formulaire et cela a bien fonctionné.
  • L'utilisation de la méthode OnPaint est lente de toute façon. Quelque part en ligne, j'ai lu que la construction de PaintEventArgs était lente et qu'ils ne plaisantaient pas. Beaucoup de scintillement a disparu quand j'ai abandonné cela. Ignorez OnPaint/Invalidate () et peignez-le vous-même.
  • 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.

52
Clinton Pierce

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).

15
Nick

2d Game Primer

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.

7
StubbornMule