2016-11-24 31 views
0

我試圖在Windows窗體應用程序上創建一個動畫位圖。一個計時器對象被設置爲100ms的間隔,並且代碼的工作原理是這樣的:運行幾幀後,位圖動畫停止工作

我有一個2560x2560位圖,它是我的地圖,名爲'pb'的圖片框包含此地圖,圖片框的大小爲800x800與圖像拉伸參數,以提供更好的分辨率。我有一個包含火炬幀的7個元素的位圖數組。這個想法是,我將當前火炬位圖繪製到地圖上,將'pb'圖像設置爲地圖並調用無效過程來重繪它。然後,將繪製到其上的火炬的位圖恢復爲原始地圖位圖'org_btm'。

的代碼如下:

 private void animationtick_Tick(object sender, EventArgs e) 
     { 
      using (Graphics g = Graphics.FromImage(btm)) 
      { g.DrawImage(torch_anim[torch_anim_c], new Point(20*64, 20*64)); } 
      pb.Image = btm; 
      pb.Invalidate(); 
      btm = org_btm; 

      if (torch_anim_c < 6) 
      { 
       torch_anim_c++; 
      } 
      else 
      { 
       torch_anim_c = 0; 
      } 
      pb.Invalidate(); 
     } 

'torch_anim_c' 是位圖陣列的索引計數器。 所以發生的問題是,火炬工作的第一個幾幀,並停止工作後,被困在1幀,當我運行代碼調試器中斷點時,它表明代碼運行,即使當圖像卡住了,程序響應其他功能仍在工作。 你有什麼想法如何解決這個問題? 預先感謝您。

我有被卡住的火炬動畫地圖的一個片段: Torch Stuck Snippet

編輯:在「點()」是20 * 64,因爲火炬的尺寸爲64×64,它是在20位和地圖40 * 40瓦。

+0

在'pb.Invalidate();'之前,檢查'pb.InvokeRequired'是否爲'true'。 –

+0

問題仍然存在,因爲它是:( – Deivis

+0

其實,我刪除了代碼行,我做了'torch_anim [i] .maketransparent(Color.FromArgb(255,255,255,255));'這似乎解決了卡住的問題,我不知道沒有任何線索爲什麼,但是我仍然需要使動畫透明 – Deivis

回答

0

用photoshop將其轉換爲GIF格式,然後使用這個類

public class GifImage 
{ 
    private Image gifImage; 
    private FrameDimension dimension; 
    private int frameCount; 
    private int currentFrame = -1; 
    private bool reverse; 
    private int step = 1; 

    public GifImage(string path) 
    { 
     gifImage = Image.FromFile(path); 
     dimension = new FrameDimension(gifImage.FrameDimensionsList[0]); 
     frameCount = gifImage.GetFrameCount(dimension); 
    } 

    public bool ReverseAtEnd { 
     get { return reverse; } 
     set { reverse = value; } 
    } 

    public Image GetNextFrame() 
    { 

     currentFrame += step; 
     if (currentFrame >= frameCount || currentFrame < 1) { 
      if (reverse) { 
       step *= -1; 
       currentFrame += step; 
      } 
      else { 
       currentFrame = 0; 
      } 
     } 
     return GetFrame(currentFrame); 
    } 

    public Image GetFrame(int index) 
    { 
     gifImage.SelectActiveFrame(dimension, index); 
     return (Image)gifImage.Clone(); 
    } 
} 

在formload初始化它OT每當

GifImage gifImage = new GifImage(filePath); 

設置反向變量設置爲true,如果妍想在扭轉它end

at timer tick使用該代碼

pb.Image = gifImage.GetNextFrame(); 
+0

謝謝,這沒有工作相當好 – Deivis

+0

不客氣@Deivis – Th3Wolf

-1

change pb.Invalidate();與pb.Update();

+0

我改變它,它似乎做同樣的事情 – Deivis