如何自动平滑移动图像?在c#中

时间:2014-12-16 09:06:01

标签: c# winforms animation

我想实现图像在无限循环中作为背景流动的代码。去做这个。 我准备了2个图像对象(图片框)。那么

我实现了如下的移动图像代码。 (我在本主题中清理了一些不必要的代码)

private void InitializeComponent()
{
    this.p1.Image = ((System.Drawing.Image)(resources.GetObject("picture")));
    this.p1.Location = new System.Drawing.Point(0, -1000); // 0,0 // 0, -1000
    this.p1.Size = new System.Drawing.Size(1000, 1000);

    this.p2.Image = ((System.Drawing.Image)(resources.GetObject("picture")));
    this.p2.Location = new System.Drawing.Point(0, 1000); // 0,0 // 0, -1000
    this.p2.Size = new System.Drawing.Size(1000, 1000);

    t1 = new Thread(new ParameterizedThreadStart(loop));
    t1.Start();
}

private void loop(Object o)
{
    CTMethod cttest = new CTMethod(movePictureBox);
    while (true)
    {
        try
        {
            this.Invoke(cttest);
            Thread.Sleep(10); // I updated..
        } catch(Exception e) {
            break;
       }
    }
}

private void movePictureBox()
{

    if (p1.Top == 0)
    {
        p2.Top = p1.Top-p2.Height;
    }

    if (p2.Top == 0)
    {
        p1.Top = p2.Top-p1.Height;
    }

    p1.Top++;
}

此代码效果很好。但我遇到了一些问题。 2个图像的链接线(连接线)看起来是口吃或偶尔发抖。 我不知道为什么图像像这样移动。这与lerp(插值)有关系吗? 如果有人知道原因,你能帮我吗?

2 个答案:

答案 0 :(得分:0)

这可能是因为您使用的是System.Drawing.Point

http://msdn.microsoft.com/en-us/library/system.drawing.point%28v=vs.110%29.aspx

这意味着由System.Drawing.Point确定的位置将捕捉整数,从而在动画期间导致一个像素的跳跃。

您可能希望使用System.Drawing.Pointf(因为它使用浮点数而不是整数)

同样适用于System.drawing.size,它以整数形式描述宽度和高度

MSDN on system.drawing.size

不幸的是,所有Winforms控件(如Rotem所指出的)都使用System.Drawing.Point,这使得它们本身不适合平滑动画。

最好不要将图片直接绘制到Graphics对象。

答案 1 :(得分:0)

您可以尝试在表单构造函数中添加此代码,

SetStyle( ControlStyles.ResizeRedraw, true );
SetStyle( ControlStyles.UserPaint, true );
SetStyle( ControlStyles.AllPaintingInWmPaint, true );   
SetStyle( ControlStyles.OptimizedDoubleBuffer, true ); 

在WinForms中自定义绘图不是一个好选择,XNA是不错的选择,它用双缓冲区绘制。