ハロウィーンの表示のために、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を呼び出しました。ちらつきはまったくありません。