多图像动画使用循环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;
                    }
            }
        }
    }

}
}

这是我所能得到的。如果有人有任何见解,或者能给我指出正确的方向,让这个工作,那就太棒了。

多图像动画使用循环c#

你的代码有一些问题,所以我重新写了一遍,我注释掉了你有问题的地方

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)。

这工作得很漂亮,所以我将提供这个解决方案,任何人谁想要一个基本的动画为他们的代码:)

感谢大家的回答和时间。