C#中的动画使用几个PNG

时间:2014-06-22 07:02:28

标签: c# animation png sprite picturebox

我试图制作一个触发动画的点击事件。我已经绘制了所有帧并将它们保存为单独的PNG文件(所有帧都是38像素长,56像素宽),但我无法弄清楚如何通过PictureBox运行它们。

我看过很多帖子(这里和其他地方),人们谈论计时器,但我还没有能够弄清楚如何从我的点击事件中调用这些长的例子。或者,我将帧导出为a single animated GIF,但GIF始终循环,我只希望动画播放一次。

以下是我所拥有的:

private void btnStart_Click(object sender, EventArgs e)
{
    int delay = 100;
    box1.Image = Project.Properties.Resources.frame1;
    System.Threading.Thread.Sleep(delay);
    box1.Image = Project.Properties.Resources.frame2;
    System.Threading.Thread.Sleep(delay);
    box1.Image = Project.Properties.Resources.frame3;
    System.Threading.Thread.Sleep(delay);
    box1.Image = Project.Properties.Resources.frame4;
    System.Threading.Thread.Sleep(delay);
    box1.Image = Project.Properties.Resources.frame5;
    System.Threading.Thread.Sleep(delay);
    box1.Image = Project.Properties.Resources.frame6;
    System.Threading.Thread.Sleep(delay);
    box1.Image = Project.Properties.Resources.frame7;
    System.Threading.Thread.Sleep(delay);
    box1.Image = Project.Properties.Resources.frame8;
    //(and so on)
}

等待大约一秒钟,然后突然切换到最后一帧(本例中为frame8),无论延迟变量是什么。

我可能接近这个完全错误。你们觉得怎么样?

2 个答案:

答案 0 :(得分:0)

事件处理程序阻止主线程。 UI在主线程中刷新。

所以,你点击按钮,事件处理程序阻止线程并执行,你所做的任何改变都不会受到影响,直到事件处理程序完成 - 这正是你所经历的。

因此,在按钮单击事件处理程序中,您需要启动进程,但进程本身应位于单独的线程中。最简单的方法是,如果你使用逐帧动画,就是使用定时器。

您需要在计时器中设置间隔,并且在计时器刻度事件中您需要在图片框中加载新图像。您需要通过单独的变量跟踪当前帧索引。如果在内部刻度事件中你意识到它是最后一个图像 - 设置计时器被禁用。在按钮单击事件中重置计时器和帧变量。

答案 1 :(得分:0)

我最终做的是在第一个答案和this video tutorial之后搜索“过程本身应该在单独的线程中”的提示。我做的是放

using System.Threading;

在我的代码开头,放

Thread animationThread;

在所有主要事件之前,放

animationThread = new Thread(back2front_card1);
animationThread.Start();
单击事件中的

,并将所有box1.Image和delay命令放入:

public void back2front_card1()
{
}

这完美地运行动画!