2012-10-31 97 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()調用之間。