Chain Reaction (http://www.yvoschaap.com/chainrxn/) のようなゲームを C#/winform で作ろうとしていますが、Chain Reaction の効果のように画像をスムーズに動かす方法が見つかりません。誰でも私にいくつかのアイデアを与えることができますか?
3 に答える
これは、ゲーム、グラフ、オーナー描画コントロールなど、あらゆる種類のカスタム描画を WinForms に実装する際によくある問題です。問題は、デフォルトですべての WinForms コントロールの DoubleBuffer プロパティが False に設定されていることです。
Form の DoubleBuffer プロパティを True に設定すると、その厄介なちらつきがなくなります。
コメントで示唆されているように、XNA はゲーム開発に適していますが、WinForms で簡単に修正するには、フォームをdouble bufferでペイントするように設定するだけで済みます。
前回、C#で何かを動かさなければならなかったときは、タイマーを使用しました。次のように、ティックごとに画像の位置を増減します。
image.Left += 1;
私の記憶が正しければ、それはうまく機能していましたが、実装が簡単かどうかはわかりません。
とにかくお役に立てば幸いです!幸運を。
フォーム コンストラクターに次の行を追加します。
SetStyle( ControlStyles.ResizeRedraw, true );
SetStyle( ControlStyles.UserPaint, true );
SetStyle( ControlStyles.AllPaintingInWmPaint, true );
SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
これは、再読み込みを最適化するのに役立ちます。
あなたの動きには、一定の時間でコントロールを無効にするタイマーを使用する必要があります...そして、動きのちらつきを避けるために、PointFのような浮動小数点構造体に計算を保持する必要があります...
// This will move 30 pixels per second it rate is the elapsed time in seconds between calls to the update position method, and should move smooth :)
PointF Velocity = (30,0) * time_rate;
PointF Pos = Pos + Velocity;
そして、この方法でボールを描画できるペイントメソッドで、スクリーンゲームになるコントロールのみを使用する必要があります。おそらくPictureBoxです。
private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
foreach (Ball ball in balls)
{
ball.Update();
g.FillEllipse(ball.Brush, ball.Pos.X - ball.Radius, ball.Pos.Y - ball.Radius, ball.Radius*2, ball.Radius*2);
}
}