如何使用C#使图像顺利移动

时间:2012-05-04 12:47:18

标签: c# image

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

3 个答案:

答案 0 :(得分:1)

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

将Form的DoubleBuffer属性设置为true将消除恼人的闪烁。

XNA是评论中建议的游戏开发的不错选择,但是为了快速修复WinForms,您可能需要做的就是将表单设置为使用double buffer进行绘制。

答案 1 :(得分:1)

上次我不得不在c#中使用定时器。 每个刻度都会增加/减少图像位置,如下所示:

image.Left += 1;

如果我没记错的话,它的工作做得很好,但我不确定它是否易于实施。

我希望无论如何都有帮助!祝你好运。

答案 2 :(得分: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);
   }
}