Prosta animacja przy użyciu C # / Windows Forms

Muszę wybić szybką animację w C # / Windows Forms na pokaz Halloween. Tylko niektóre kształty 2D poruszają się po solidnym tle. Ponieważ jest to szybki projekt jednorazowy Inaprawdę nie chcę instalować i uczyć się całego nowego zestawu narzędzi. (Zestawy dev DirectX, Silverlight, Flash itp.) Muszę także zainstalować to na wielu komputerach, więc wszystko poza podstawową strukturą .Net (2.0) byłoby bolesne.

Dla narzędzi mam VS2k8, 25 lat doświadczenia w rozwoju, taczkę, płaszcz holokaustu i około 2 dni, aby to znokautować. Nie wykonałem animacji od czasu użycia asemblera na moim Atari 130XE (hooray do odwracania stron i grafiki gracza / rakiety!)

Rada? Oto kilka rzeczy, które chciałbym wiedzieć:

Mogę rysować na dowolnym pustym widżecie (np. Panelu), bawiąc się programem obsługi OnPaint, prawda? W ten sposób narysuję niestandardowy widget. Czy jest lepsza technika niż ta?Czy w systemie Windows Forms istnieje technika przerzucania stron? Nie szukam wysokiej częstotliwości klatek, tak mało migotania / rysowania, jak to konieczne.

Dzięki.

Post Mortem Edit ... „kilka dni kodowania później”

Cóż, projekt się skończył. Poniższe linki okazały się przydatne, chociaż kilka z nich to 404. (Żałuję, że TAK nie pozwoli na oznaczenie więcej niż jednej odpowiedzi „poprawna”). Największym problemem, który musiałem pokonać, było migotanie i uporczywy błąd, gdy próbowałem bezpośrednio rysować na formularzu.

Używanie zdarzenia OnPaint dla formularza: zły pomysł. Nigdy nie miałem tego do pracy; wiele tajemniczych błędów (przepełnienie stosu lub ArgumentNullExceptions). Skończyłem za pomocą panelu o rozmiarze do wypełnienia formularza i to działało dobrze.Korzystanie z metody OnPaint i tak jest powolne. Gdzieś w internecie przeczytałem, że budowanie PaintEventArgs było powolne i nie żartowali. Dużo migotania odeszło, kiedy to porzuciłem. Pomiń OnPaint / Invalidate () i po prostu go pomaluj.

Ustawienie wszystkich opcji „podwójnego buforowania” w formularzu nadal pozostawiało trochę migotania, które należało naprawić. (I znalazłem sprzeczne dokumenty, które mówiły „ustaw je na kontrolce” i „ustaw je na formularzu”. Cóż kontrolki nie mają metody .SetStyle ().) Nie testowałem bez nich, więc mogą być robić coś (this to forma):

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

Więc koń roboczy kodu wyglądał jak (pf jest panel sterowania):

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

I właśnie nazwałem PaintPlayField z wnętrza mojej pętli Timer. Żadnego migotania.

questionAnswers(2)

yourAnswerToTheQuestion