使用多个PNG的C#动画

使用多个PNG的C#动画,c#,animation,png,sprite,picturebox,C#,Animation,Png,Sprite,Picturebox,我正在尝试创建一个触发动画的单击事件。我已经绘制了所有帧并将它们保存为单独的PNG文件(所有帧长38像素,宽56像素),但我不知道如何通过PictureBox运行它们 我看了很多关于计时器的帖子(这里和其他地方),但我还没有弄清楚如何从我的点击事件中调用这些长示例。或者,我将帧导出为,但GIF始终循环,并且我只希望动画播放一次 以下是我所拥有的: private void btnStart_Click(object sender, EventArgs e) { int delay = 1

我正在尝试创建一个触发动画的单击事件。我已经绘制了所有帧并将它们保存为单独的PNG文件(所有帧长38像素,宽56像素),但我不知道如何通过PictureBox运行它们

我看了很多关于计时器的帖子(这里和其他地方),但我还没有弄清楚如何从我的点击事件中调用这些长示例。或者,我将帧导出为,但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)
}
这将等待大约一秒钟,然后突然切换到最后一帧(本例中为第8帧),无论延迟变量是什么


我可能完全错了。你们怎么看?

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

所以,点击按钮,事件处理程序阻塞线程并执行,在事件处理程序完成之前,您所做的任何更改都不会在UI上受到影响—这正是您所经历的

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


你们需要在定时器中设置间隔,在定时器滴答声事件中,你们需要在图片框中加载新图像。您需要通过单独的变量跟踪当前帧索引。如果在勾号事件中,您意识到这是最后一个禁用的图像设置计时器。重置button click事件中的计时器和帧变量。

我最终做的是在谷歌上搜索第一个答案和后面的提示“进程本身应该在单独的线程中”。我所做的是

using System.Threading;
在我的代码开头,将

Thread animationThread;
在所有主要活动之前,把

animationThread = new Thread(back2front_card1);
animationThread.Start();
在click事件中,将所有box1.Image和delay命令放在以下位置:

public void back2front_card1()
{
}

这将完美地运行动画

这是有道理的。不过,我对计时器一无所知。我已经看过这个---,但我不知道它是什么意思。我假设您使用的是winforms,所以您只需要将计时器组件添加到表单中,然后双击它来创建计时器处理程序。然后您需要创建类变量来处理帧索引。好的。我将所有图像和延迟命令粘贴到新的timer1_Tick事件中,并将“timer1_Tick();”放入click事件中。它在这个引用下面加了下划线,好像它需要某种类型的输入变量。你不应该直接调用
timer\u Tick
,你应该使它处于活动或非活动状态。当计时器处于活动状态时(其属性
已启用
),则它会通过
间隔
以毫秒为单位(这是另一个计时器属性)通过其LEF生成
计时器勾号
事件。所以定时器在默认情况下应该被禁用,在按钮点击中你们需要启用它,在最后一个定时器勾选中你们需要再次禁用定时器。对不起,我之前并没有响应,我必须去睡觉了。我把“timer1.Start();”和“timer1.Stop();”放在前面的所有内容之后。它仍然会暂停一秒钟,然后跳到最后一帧。我做错了什么?