it-swarm.com.de

Einfache Animation mit C # / Windows Forms

Ich muss eine schnelle Animation in C #/Windows Forms für eine Halloween-Anzeige ausschalten. Nur einige 2D-Formen, die sich auf einem festen Hintergrund bewegen. Da dies nur ein kurzes einmaliges Projekt ist, möchte ich wirklich nicht eine ganze Reihe neuer Tools installieren und lernen. (DirectX-Entwicklungskits, Silverlight, Flash usw.) Ich muss dies auch auf mehreren Computern installieren, damit alles, was über das grundlegende .NET-Framework (2.0) hinausgeht, nervt.

Für Tools habe ich VS2k8, 25 Jahre Entwicklungserfahrung, eine Schubkarre, einen Holocaust-Umhang und ungefähr 2 Tage Zeit, um dies auszuschalten. Ich habe keine Animation mehr gemacht, seit ich Assembler auf meinem Atari 130XE verwendet habe (Hurra für das Umblättern von Seiten und Player-/Raketengrafiken!)

Rat? Hier sind einige Dinge, die ich gerne wissen würde:

  • Ich kann auf jedes leere Widget (wie ein Panel) zeichnen, indem ich mit dem OnPaint-Handler experimentiere, oder? So würde ich ein benutzerdefiniertes Widget zeichnen. Gibt es eine bessere Technik als diese?
  • Gibt es eine Methode zum Umblättern von Seiten in Windows Forms? Ich suche keine hohe Bildrate, nur so wenig Flackern/Zeichnen wie nötig.

Vielen Dank.

Post Mortem Edit ... "ein paar Codierungstage später"

Nun, das Projekt ist abgeschlossen. Die folgenden Links haben sich als nützlich erwiesen, obwohl es sich bei einigen um 404 handelte. (Ich wünschte, SO würde mehr als eine Antwort als "korrekt" markieren.) Das größte Problem, das ich bewältigen musste, war das Flackern und ein anhaltender Fehler, als ich versuchte, direkt auf das Formular zu zeichnen.

  • Verwenden des OnPaint-Ereignisses für das Formular: schlechte Idee. Ich habe das nie zum Laufen gebracht; viele mysteriöse Fehler (Stapelüberläufe oder ArgumentNullExceptions). Ich landete mit einer Tafel, die so groß war, dass sie das Formular ausfüllte, und das hat gut funktioniert.
  • Die Verwendung der OnPaint-Methode ist ohnehin langsam. Irgendwo online las ich, dass das Erstellen der PaintEventArgs langsam war, und sie machten keine Witze. Viel Flackern ging weg, als ich das aufgab. Überspringe das OnPaint/Invalidate () und male es einfach selbst.
  • Das Setzen aller "Doppelpuffer" -Optionen im Formular ließ noch etwas Flimmern zurück, das behoben werden musste. (Und ich habe widersprüchliche Dokumente gefunden, die besagten: "Setze sie auf das Steuerelement" und "Setze sie auf das Formular". Nun, Steuerelemente haben keine .SetStyle () -Methode.) Ich habe sie nicht ohne sie getestet, also könnten sie es sein etwas tun (this ist die Form):

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

Das Arbeitspferd des Codes sah also so aus (pf ist das Bedienfeld):

    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);
        }
    }

Und ich habe PaintPlayField gerade aus meiner Timer-Schleife heraus aufgerufen. Überhaupt kein Flimmern.

52
Clinton Pierce

Stellen Sie einen Timer mit der gewünschten Bildrate ein. Bei jedem Timer-Start wird die interne Darstellung der Formen auf dem Bildschirm (Ihrem Modell) für die gewünschte Animationsbewegung geändert. Rufen Sie dann Invalidate(true) auf. Zeichnen Sie im OnPaint einfach das Modell auf den Bildschirm.

Oh ja, und Sie möchten wahrscheinlich Double Buffering aktivieren (dies entspricht dem automatischen Umblättern von Seiten).

15
Nick

2d Game Primer

Timer-basierte Animation

Beide geben gute Beispiele für Animationen. Der Code ist ziemlich einfach. Ich habe diese verwendet, als ich eine schnelle Animation für meinen Sohn machen musste.

7
StubbornMule