53 votes

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

J'ai besoin de réaliser une animation rapide en C#/Windows Forms pour un affichage d'Halloween. Il s'agit simplement de quelques formes 2D se déplaçant sur un fond solide. Comme il s'agit d'un projet ponctuel et rapide, je realmente Je ne veux pas installer et apprendre un nouvel ensemble d'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 .Net de base (2.0) serait une plaie.

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 réaliser ce projet. Je n'ai pas fait d'animation depuis que j'ai utilisé l'assembleur sur mon Atari 130XE (hourra pour le feuilletage des pages et les graphiques des joueurs et des missiles !)

Conseils ? Voici quelques-unes des choses que j'aimerais savoir :

  • Je peux dessiner sur n'importe quel widget vide (comme un panneau) en jouant avec son gestionnaire OnPaint, n'est-ce pas ? C'est ainsi que je dessinerais un widget personnalisé. Existe-t-il une meilleure technique que celle-ci ?
  • Existe-t-il une technique de basculement de page pour ce genre de choses dans Windows Forms ? Je ne recherche pas une fréquence d'images élevée, mais le moins de scintillement/dessin possible.

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 certains d'entre eux soient 404. (J'aimerais que SO permette de marquer "correct" plus d'une réponse). Le plus gros problème que j'ai dû surmonter était le scintillement, et un bug persistant lorsque j'ai essayé de dessiner directement sur le formulaire.

  • Utiliser l'événement OnPaint pour le formulaire : mauvaise idée. Je n'ai jamais réussi à le faire fonctionner ; beaucoup d'erreurs mystérieuses (débordements de pile, ou ArgumentNullExceptions). J'ai fini par utiliser un panneau de la taille du formulaire et cela a bien fonctionné.
  • L'utilisation de la méthode OnPaint est de toute façon lente. J'ai lu quelque part en ligne que la construction des PaintEventArgs était lente, et ils ne plaisantaient pas. Beaucoup de scintillements ont disparu lorsque j'ai abandonné cette méthode. Sautez la méthode OnPaint/Invalidate() et peignez vous-même.
  • Le paramétrage de toutes les options de "double buffering" sur le formulaire laissait encore un scintillement qui devait être corrigé. (Et j'ai trouvé des documents contradictoires qui disaient "définir les options sur le contrôle" et "définir les options sur le formulaire". Les contrôles n'ont pas de méthode .SetStyle()). Je n'ai pas testé sans eux, donc ils peuvent faire quelque chose ( this est le formulaire) :

        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

Ainsi, la partie la plus importante du code ressemblait à ( pf est la commande du panneau) :

    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 à l'intérieur de ma boucle Timer. Pas de scintillement du tout.

15voto

Nick Points 7173

Déclenchez une minuterie à la fréquence d'images que vous souhaitez. À chaque tir de minuterie, modifiez la représentation interne des formes à l'écran (votre modèle) selon le mouvement d'animation que vous souhaitez obtenir, puis appelez Invalidate(true) . Dans le OnPaint, il suffit de dessiner le modèle sur l'écran.

Oh oui, et vous voudrez probablement activer la double mise en mémoire tampon (c'est comme le retournement automatique des pages).

7voto

StubbornMule Points 855

Abécédaire du jeu 2d

Animation basée sur une minuterie

Ces deux exemples sont de bons exemples d'animation. Le code est assez simple. Je les ai utilisés lorsque j'ai eu besoin de faire une animation rapide pour mon fils.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X