2

我正在尝试使用 C#/winform 制作类似 Chain Reaction (http://www.yvoschaap.com/chainrxn/) 的游戏,但我找不到一种方法让图像像 Chain Reaction 中的效果一样平滑移动.任何人都可以给我一些想法?

4

3 回答 3

3

这是在 WinForms 中实现任何类型的自定义绘图时的常见问题,无论是游戏、图形还是任何所有者绘制的控件。问题是默认情况下所有 WinForms 控件都将 DoubleBuffer 属性设置为 False。

将 Form 的 DoubleBuffer 属性设置为 True 将消除烦人的闪烁。

正如评论中所建议的那样,XNA 是游戏开发的不错选择,但要在 WinForms 中快速修复,您可能需要做的就是将 Form 设置为使用双缓冲区进行绘制。

于 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,在paint方法中你可以这样绘制球:

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 回答