2008-10-09 21 views
43

我需要在C#/ Windows窗體中爲萬聖節顯示敲出一個快速動畫。只有一些2D圖形在堅實的背景上移動。由於這只是一個快速的一次性項目,我不想爲此安裝和學習一整套新工具。 (DirectX開發工具包,Silverlight,Flash等)。我還必須在多臺計算機上安裝它,因此超出基本.Net框架(2.0)的任何內容都將是一件痛苦的事情。使用C#/ Windows窗體的簡單動畫

對於工具我有VS2k8,25年的發展經驗,獨輪車,大屠殺斗篷,大約2天將其敲除。自從在我的Atari 130XE上使用匯編程序以來,我還沒有完成動畫(用於頁面翻轉和播放器/導彈圖形的萬歲!)

建議?這裏有一些我想知道的事情:

  • 我可以通過擺弄它的OnPaint處理程序來繪製任何空的小部件(如面板),對不對?這就是我如何繪製自定義小部件。有沒有比這更好的技術?
  • 在Windows窗體中是否有這種類型的頁面翻轉技術?我不是在尋找高幀頻,就像必要的閃爍/繪圖一樣。

謝謝。

驗屍編輯...「一對夫婦編碼天后的」

那麼,該項目已經完成。下面的鏈接派上用場,雖然其中有一些是404。(我希望SO會允許多於一個的回覆被標記爲「正確」)。我必須克服的最大問題是閃爍,並且當我試圖直接在表單上繪製時出現持續性錯誤。

  • 對錶單使用OnPaint事件:壞主意。我從來沒有這樣做的工作;大量的神祕錯誤(堆棧溢出或ArgumentNullExceptions)。我使用一個大小適合填寫表格並且工作正常的面板。
  • 無論如何,使用OnPaint方法都很慢。我在網上的某處看到,構建PaintEventArgs的速度很慢,而且他們不是在開玩笑。當我放棄這個時,許多閃爍就消失了。跳過OnPaint/Invalidate()並且自己繪製它。
  • 設置窗體上的所有「雙緩衝」選項仍然會留下一些必須修復的閃爍。 (我發現相互衝突的文檔說「設置它們在控件上」和「將它們設置在窗體上」。井控件沒有.SetStyle()方法。)我沒有測試沒有它們,所以它們可能是做一些事情(this的形式):

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

因此,代碼的主力傷口看起來像(pf是面板控制):

void PaintPlayField() 
    { 
     Bitmap bufl = new Bitmap(pf.Width, pf.Height); 
     using (Graphics g = Graphics.FromImage(bufl)) 
     { 
      g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pf.Width, pf.Height)); 
      DrawItems(g); 
      DrawMoreItems(g); 
      pf.CreateGraphics().DrawImageUnscaled(bufl, 0, 0); 
     } 
    } 

我只是叫PaintPlayField從我的Timer循環的內部。沒有閃爍。

+1

請參閱相關的[winforms中的簡單動畫問題](http://stackoverflow.com/questions/11318/simple-animation-in-winforms)。 – 2008-10-12 07:18:22

回答

13

以您想要的幀頻設置一個定時器。在每個定時器點擊旋轉屏幕上的形狀的內部表示(您的模型),根據您想要實現的動畫運動,然後致電Invalidate(true)。 OnPaint內部只需在屏幕上繪製模型。

哦,是的,你可能想打開雙緩衝(這就像自動頁面翻轉)。