2012-10-31 34 views
3

首先是代码。在C中构建流畅的动画#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace winform_project 
{ 
    public partial class Form1 : Form 
    { 
    void movement_correct(PictureBox pic, int i) 
    { 
     System.Threading.Thread.Sleep(25); 
     pic.Top += (i - 1); 
     pic.Left += (i + 3); 
    } 

    void movement_up(PictureBox pic, int i) 
    { 
     System.Threading.Thread.Sleep(25); 
     pic.Top -= (i - 1); 
     pic.Left -= (i + 3); 
    } 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      movement_correct(pictureBox1, i); 
      movement_correct(pictureBox2, i); 
      movement_correct(pictureBox3, i); 
      movement_correct(pictureBox4, i); 
      movement_correct(pictureBox5, i); 
      movement_correct(pictureBox6, i); 
      movement_correct(pictureBox7, i); 
      movement_correct(pictureBox8, i); 
      movement_correct(pictureBox9, i); 
      movement_correct(pictureBox10, i); 
     } 

     for (int i = 0; i < 5; i++) 
     { 
      movement_up(pictureBox1, i); 
      movement_up(pictureBox2, i); 
      movement_up(pictureBox3, i); 
      movement_up(pictureBox4, i); 
      movement_up(pictureBox5, i); 
      movement_up(pictureBox6, i); 
      movement_up(pictureBox7, i); 
      movement_up(pictureBox8, i); 
      movement_up(pictureBox9, i); 
      movement_up(pictureBox10, i); 
     } 

    } 
} 
} 

有10个虚拟图片框。每当我点击按钮,他们开始移动一下(有点像太空侵略者的敌人)。

我想在winforms中制作一个流畅的动画。问题在于动画不如我想要的那样流畅。在我的代码中,所有的盒子都没有同时移动,它们的移动有一点点明显的差距。我想要的是流畅的运动。

我想到多线程它,但后来意识到这将意味着每个对象的一个​​thead。有没有其他的方法(在Winforms中)。

感谢您的帮助。

+0

标记此WinForms。怀疑多线程是不会有帮助的。你可以去WPF? – Paparazzi

+0

noop没有WPF .... –

+0

睡眠25毫秒每个控制运动将导致它移动控制在4 fps。这将显着缓慢。 –

回答

1

使用Thread.Sleep(n)进行计时是保证获得平滑动画的方法;这是因为传递给Thread.Sleep的值被操作系统视为最小休眠时间,这意味着实际的休眠持续时间可能会(通常会)更长一些。您应该使用QueryPerformanceCounter来驱动动画。

即使有适当的高分辨率时序引擎,您仍然会有“撕裂”效果。

+0

链路上的意见。即使如此,如你所说,动画的“平滑度”并没有明显的差异。我猜它是其中一种技术的限制。 –

+0

不,这是可以做到完美流畅的动画的WinForms(除了“撕裂”,这是一个不同的问题)。发布您的修改后的代码(使用QueryPerformanceCounter),我们应该可以确定问题。你的代码中不应该有任何'Thread.Sleep(n)'调用。 – MusiGenesis

1

在您的for循环中调用this.SuspendLayout()this.ResumeLayout()将有助于保持所有框在同一时间移动。它可能不会让你顺利,但它会使所有事物都保持一致。

+0

没有明显的影响..无论如何 –

1

获取sleep()出来的方法和循环迭代做一次将降低(大于250毫秒)的延迟(略多于25毫秒),每个方格的movement_correct()movement_up()调用之间。