多图像动画使用循环c#
本文关键字:循环 图像 动画 | 更新日期: 2023-09-27 18:02:26
我正在尝试使用一个简单的管理器来制作一个基本的,非常简单的动画功能。问题是,就目前而言,当用户单击主表单上的"Go"时,它将显示第一张图像,然后跳转到最后一张图像。
我还尝试插入一个延迟,它延迟了从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;
}
}
}
}
}
}
这是我所能得到的。如果有人有任何见解,或者能给我指出正确的方向,让这个工作,那就太棒了。
你的代码有一些问题,所以我重新写了一遍,我注释掉了你有问题的地方
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
}
}
}
在等待答案的同时,我继续尝试自己做……:)谢谢你的回答和评论…
这是我的最终解决方案…
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;
}
}
}
我犯了一个基本的错误,没有使用设置好的"I"。相反,我操纵了一堆与循环意图本身无关的东西。
我同意上面那个人的观点——我没有在我的解决方案中使用开关。这没有意义,因为如果isloop为真,我只有一个条件可以重置循环(将I操作回1)。
这工作得很漂亮,所以我将提供这个解决方案,任何人谁想要一个基本的动画为他们的代码:)
感谢大家的回答和时间。