2

Chain Reaction (http://www.yvoschaap.com/chainrxn/) のようなゲームを C#/winform で作ろうとしていますが、Chain Reaction の効果のように画像をスムーズに動かす方法が見つかりません。誰でも私にいくつかのアイデアを与えることができますか?

4

3 に答える 3

3

これは、ゲーム、グラフ、オーナー描画コントロールなど、あらゆる種類のカスタム描画を WinForms に実装する際によくある問題です。問題は、デフォルトですべての WinForms コントロールの DoubleBuffer プロパティが False に設定されていることです。

Form の DoubleBuffer プロパティを True に設定すると、その厄介なちらつきがなくなります。

コメントで示唆されているように、XNA はゲーム開発に適していますが、WinForms で簡単に修正するには、フォームをdouble bufferでペイントするように設定するだけで済みます。

于 2012-05-04T12:52:29.073 に答える
1

前回、C#で何かを動かさなければならなかったときは、タイマーを使用しました。次のように、ティックごとに画像の位置を増減します。

image.Left += 1;

私の記憶が正しければ、それはうまく機能していましたが、実装が簡単かどうかはわかりません。

とにかくお役に立てば幸いです!幸運を。

于 2012-05-04T12:54:12.567 に答える
0

フォーム コンストラクターに次の行を追加します。

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);
   }
}
于 2012-05-04T12:52:40.367 に答える