动画的多个图像用于循环C#

时间:2015-07-11 23:48:17

标签: c# animation

我正在尝试使用简单的管理器制作一个基本的,非常简单的动画功能。问题是,截至目前,当用户在主窗体上单击“开始”时,它将显示第一个图像,然后跳转到最后一个图像。

我还试图插入一个延迟,它将事物从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;
                    }
            }

        }
    }


}
}

这就是我能够得到的。如果任何人有任何见解或可以指出我正确的方向来实现这一点,那将是非常棒的。

2 个答案:

答案 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为真。

这很好用,所以我会为想要一个基本的动画师代码的人提供这个解决方案:)

感谢所有人的答案和时间。