web-dev-qa-db-ja.com

C#/ Windowsフォームを使用したシンプルなアニメーション

ハロウィーンディスプレイのために、C#/ Windowsフォームのクイックアニメーションをノックアウトする必要があります。単色の背景上で動き回る2D図形のみ。これは単なる一回限りのプロジェクトであるため、私はreallyの新しいセット全体をインストールして学習したくないこのためのツール。 (DirectX開発キット、Silverlight、Flashなど。)また、これを複数のコンピューターにインストールする必要があるため、基本的な.Netフレームワーク(2.0)以外のものは苦痛になります。

ツールについては、25年の開発経験を持つVS2k8、手押し車、ホロコーストマント、そしてこれをノックアウトするのに約2日かかりました。 Atari 130XEでアセンブラーを使用して以来、アニメーションを実行していません(ページフリッピングとプレーヤー/ミサイルグラフィックスにご注意ください!)

助言?知りたいことがいくつかあります。

  • OnPaintハンドラーをいじることで、空のウィジェット(パネルなど)を描画できますか?それが、カスタムウィジェットを描く方法です。これより良いテクニックはありますか?
  • Windows Formsにこの種のページフリップテクニックはありますか?ちらつき/描画が必要なだけ少ない高フレームレートを探しているわけではありません。

ありがとう。

死後編集... "コーディングの数日後"

さて、プロジェクトは完了です。以下のリンクは便利でしたが、そのうちのいくつかは404でした(SOを指定すると、複数の返信に「正しい」マークを付けられるようになります)。 、およびフォームに直接描画しようとしたときの永続的なバグ。

  • フォームにOnPaintイベントを使用する:悪い考えです。私はそれを機能させることはありませんでした。多くの不可解なエラー(スタックオーバーフロー、またはArgumentNullExceptions)。フォームを埋める大きさのパネルを使用して巻き上げたところ、うまくいきました。
  • とにかくOnPaintメソッドの使用は遅いです。オンラインのどこかで、PaintEventArgsの作成が遅く、冗談ではないことを読みました。これを放棄すると、ちらつきがたくさんなくなりました。 OnPaint/Invalidate()をスキップして、自分でペイントしてください。
  • フォームにすべての「ダブルバッファリング」オプションを設定しても、修正が必要なちらつきが残ります。 (そして、「コントロールに設定する」と「フォームに設定する」という矛盾するドキュメントを見つけました。コントロールには.SetStyle()メソッドがありません。)私はそれらなしではテストしていません。何かをする(thisはフォームです):

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

したがって、コードの主役は次のようになります(pfはパネルコントロールです):

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

そして、タイマーループの内部からPaintPlayFieldを呼び出しました。ちらつきはありません。

52
Clinton Pierce

希望するフレームレートでタイマーをオフにします。タイマーを起動するたびに、達成するアニメーションモーションごとに画面(モデル)の形状の内部表現をいじり、Invalidate(true)を呼び出します。 OnPaint内では、画面上にモデルを描くだけです。

そうそう、おそらくダブルバッファリングをオンにする必要があります(これは自動ページフリッピングに似ています)。

15
Nick

2Dゲーム入門

タイマーベースのアニメーション

どちらもアニメーションの良い例を示しています。コードはかなり簡単です。私は息子のために簡単なアニメーションを行う必要があるときにこれらを使用しました。

7
StubbornMule