我正在尝试使用简单的管理器制作一个基本的,非常简单的动画功能。问题是,截至目前,当用户在主窗体上单击“开始”时,它将显示第一个图像,然后跳转到最后一个图像。
我还试图插入一个延迟,它将事物从1延迟到最后一帧,但它只是跳转到最后一帧。我正在使用几个PNG文件,以使这个东西工作,而不是试图使用“精灵表”,这将是一个更大的痛苦,我会想象...
Here's the code for the AnimationManager class...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
namespace Animation
{
public class AnimationManager
{
public PictureBox AnimationBox;
public float widthX, heightY;
public string ImageDirectory, ImageName;
public int frame, maxFrames;
public int speed; // in milliseconds
public bool isLooping;
public AnimationManager()
{
AnimationBox = new PictureBox();
widthX = 0;
heightY = 0;
ImageName = null;
frame = 1;
speed = 0;
maxFrames = 0;
isLooping = false;
}
public async void CycleThrough(string ImageDirectory, int FPMS, int maxFrames, bool isLooping)
{
for (int i = frame; i < maxFrames + 1; i++)
{
ImageName = ImageDirectory + @"\" + frame.ToString() + ".png";
AnimationBox.Image = Image.FromFile(ImageName);
AnimationBox.Refresh();
await Task.Delay(FPMS);
switch (isLooping)
{
case false:
default:
{
frame = maxFrames;
break;
}
case true:
{
frame = 1;
break;
}
}
}
}
}
}
这就是我能够得到的。如果任何人有任何见解或可以指出我正确的方向来实现这一点,那将是非常棒的。
答案 0 :(得分:2)
你的代码中有一些问题,所以我再写一遍,然后我会在你有问题的地方发表评论
public async void CycleThrough(string ImageDirectory, int FPS, int maxFrames, bool isLooping)
{
for (int i = frame; i < maxFrames + 1; i++) // frame and maxFrames must not change. counter is i
{
ImageName = ImageDirectory + @"\" + i.ToString() + ".png"; // Get the i-th png using counter.
AnimationBox.Image = Image.FromFile(ImageName);
AnimationBox.Refresh();
await Task.Delay(TimeSpan.FromSeconds(1/FPS)); // delay in seconds.
if(isLooping && i == maxframes) // if must Loop and counter is in last iteration then start over
{
i = frame - 1; // set the counter to the first frame
}
}
}
答案 1 :(得分:0)
在等待答案的同时,我继续尝试自己做... :)谢谢你的回答和评论......
这是我的最终解决方案......
private async void CycleThrough(string ImageDirectory, int FPMS, int maxFrames, bool isLooping)
{
this.speed = FPMS;
for (int i = frame; i < maxFrames + 1; i++)
{
ImageName = ImageDirectory + @"\" + i.ToString() + ".png";
Console.WriteLine(frame.ToString());
AnimationBox.Refresh();
AnimationBox.Image = Image.FromFile(ImageName);
await Task.Delay(FPMS);
if (isLooping)
{
if (i >= maxFrames) i = 1;
}
}
}
我犯了一个基本错误,并没有使用&#34;我&#34;这是设置。相反,我操纵了一堆其他与循环意图无关的事情。
我同意上述人员 - 我在解决方案中没有使用开关。它没有意义,因为我只有一个条件可以重置循环(操作i回到1)如果isLooping为真。
这很好用,所以我会为想要一个基本的动画师代码的人提供这个解决方案:)
感谢所有人的答案和时间。