60

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

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

助言?これが私が知りたいことのいくつかです:

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

ありがとう。

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

さて、プロジェクトは完了です。以下のリンクは便利でしたが、そのうちのいくつかは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を呼び出しました。ちらつきはまったくありません。

4

2 に答える 2

15

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

そうそう、おそらくダブル バッファリングを有効にしたいでしょう (これは自動ページめくりのようなものです)。

于 2008-10-09T17:44:54.977 に答える
7

2D ゲーム入門

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

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

于 2008-10-09T18:18:34.660 に答える