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

J'ai besoin de frapper une animation rapide en C#/Windows Forms pour une fête d'Halloween de l'affichage. Juste quelques formes en 2D se déplacer sur un fond uni. Puisque c'est juste un petit projet ponctuel je vraiment ne voulez pas l'installer et d'en apprendre un tout nouvel ensemble d'outils pour cela. (DirectX dev kits, Silverlight, Flash, etc..) j'ai aussi de l'installer sur plusieurs ordinateurs, de sorte que rien au-delà de la base .Net framework (2.0) serait une douleur dans le cul.

Pour les outils j'ai VS2k8, 25 ans d'expérience dans le développement, une brouette, un holocauste manteau, et environ 2 jours pour frapper cela. Je n'ai pas fait de l'animation depuis l'utilisation de l'assembleur sur mon Atari 130XE (hourra pour le changement de page et le joueur/missiles graphiques!)

Des conseils? Voici certaines des choses que j'aimerais savoir:

  • Je peux dessiner sur une zone vide du widget (comme un panneau) en jouant avec son gestionnaire de OnPaint, droit? C'est ce que je pourrais dessiner un widget personnalisé. Est-il une meilleure technique que cela?
  • Est-il un page-flipping technique pour ce genre de chose dans les Windows Forms? Je ne suis pas à la recherche d'un taux de rafraîchissement élevé, tout comme peu de scintillement/dessin comme nécessaire.

Grâce.

Post Mortem Modifier ... "un couple de codage jours plus tard"

Bien, le projet est terminé. Les liens ci-dessous a été très utile bien qu'un couple d'entre eux ont été 404. (Je tiens permettrait à plus d'une réponse à la mention "correct"). Le plus gros problème que j'ai eu à surmonter a été de scintillement, et persistant bug quand j'ai essayé de dessiner sur le formulaire directement.

  • À l'aide de l'événement OnPaint de la Forme: mauvaise idée. Je n'ai jamais eu que de travailler; beaucoup d'erreurs mystérieuses (débordements de pile, ou ArgumentNullExceptions). Je me suis retrouvé à l'aide d'un panneau de taille pour remplir le formulaire et cela a bien fonctionné.
  • À l'aide de la méthode OnPaint est lent de toute façon. Quelque part en ligne j'ai lu que la construction de l'PaintEventArgs a été lente, et ils n'étaient pas une blague. Beaucoup de scintillement a disparu lorsque j'ai abandonné cette. Passez la OnPaint/Invalidate() et juste de la peinture elle-même.
  • Le réglage de tous de la "double buffering" options sur le formulaire reste encore un certain scintillement qui ont du être corrigés. (Et j'ai trouvé contradictoires docs qui dit "mettre sur le contrôle" et de "mettre en forme". Bien les contrôles n'ont pas .Méthode SetStyle ().) Je n'ai pas testé sans eux, de sorte qu'ils pourraient faire quelque chose (this est la forme):

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

Donc le fer de lance du code de la liquidation de la recherche comme (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 de Minuterie. Pas de scintillement à tous.

  • reportez-vous à la question simple animation en winforms.
  • Vous devriez idéalement réutiliser le Bitmap dans votre code, de chaque image, de sorte que la largeur et la hauteur ne change pas. C'est un gaspillage de l'affecter à chaque image. Il devrait également être éliminés lorsque vous avez terminé, de même que le pf.CreateGraphics() valeur de retour.