Xna动画具有不同的高度,宽度

时间:2012-05-07 21:46:28

标签: c# animation xna

我目前正在使用xna创建动画。 当帧高度,宽度和持续时间在所有帧之间相同时,我没有问题为spritesheet设置动画。

但是我没有发现它非常灵活,我想在没有相同frameHeight / Width的spritesheet的情况下制作动画,更重要的是没有持续的持续时间。

是否有任何教程或代码示例可供学习?

编辑: 我想到这样的事情,但我不能让它发挥作用:

    public void Update(GameTime gameTime)
    {
        if (elapsedTime > frameTime)
        {
            currentFrame++;
            elapsedTime = 0;
        }

        sourceRect = new Rectangle(newpositionX, newpositionY, newframeWidth, newframeHeight);
        frametime = newframetime
   }
enter code here

难点在于如何准确指定每个帧的新位置和新帧时间。

2 个答案:

答案 0 :(得分:1)

你是如何为精灵表制作动画的。

This教程展示了一个带有4x4精灵表的舞蹈笑脸。 因此它有16帧:

 | 1| 2| 3| 4|
 | 5| 6| 7| 8|
 | 9|10|11|12|
 |13|14|15|16|

完成动画的循环(在Update()中):

public void Update()
{
    currentFrame++;
    if (currentFrame == totalFrames)
        currentFrame = 0;
}

如果您想仅使用奇数的帧1,3,5,7,9,11,13,15而不使用偶数帧而不是currentFrame++;,则可以使用currentFrame+=2

对于框架高度/宽度不同的精灵表,您可以使用scaling。 如何在精灵表中导航取决于您,这意味着您不限于具有相同高度/宽度的精灵表。

至于持续时间,在我链接到的教程中,我会尽可能快地更新笑脸的帧,因为没有实施控制来处理时间延迟(意味着每秒或每隔一次更新.5因此,在当前状态下,Draw()方法将被调用60次。

答案 1 :(得分:1)

我做过这个班级

public void Update(GameTime gameTime)         {             currentAnimation =(currentAnimation + 1)%ExtractionXml.AnimationCount;

        elapsedTime += (int)gameTime.ElapsedGameTime.TotalMilliseconds;

        if (currentFrame == animationData.Animations[currentAnimation].Frames.Length)
        {
            if (Looping == true)
            currentFrame = 0;
        }

        if (elapsedTime > animationData.Animations[currentAnimation].Frames[currentFrame].Duration*1000 && currentFrame <= animationData.Animations[currentAnimation].Frames.Length-1)
        {
            Height = animationData.Animations[currentAnimation].Frames[currentFrame].Height;
            Width = animationData.Animations[currentAnimation].Frames[currentFrame].Width;
            X = animationData.Animations[currentAnimation].Frames[currentFrame].X;
            Y = animationData.Animations[currentAnimation].Frames[currentFrame].Y;

            sourceRect = new Rectangle(X, Y, Width, Height);
            //destinationRect = new Rectangle((int)Position.X - (int)(Width * scale) / 2, (int)Position.Y - (int)(Height * scale) / 2, (int)(Width * scale), (int)(Height * scale));
            destinationRect = new Rectangle(scale* ((int)Position.X - (animationData.Animations[currentAnimation].Frames[currentFrame].Width / 2) + (animationData.Animations[currentAnimation].Frames[currentFrame].OffSetX))
                                          , scale * ((int)Position.Y - (animationData.Animations[currentAnimation].Frames[currentFrame].Height / 2) + (animationData.Animations[currentAnimation].Frames[currentFrame].OffSetY))
                                          , scale * animationData.Animations[currentAnimation].Frames[currentFrame].Width
                                          , scale * animationData.Animations[currentAnimation].Frames[currentFrame].Height);
            //destinationRect = new Rectangle(0 , 0 , animationData.Animations[currentAnimation].Frames[currentFrame].Width, animationData.Animations[currentAnimation].Frames[currentFrame].Height);
            currentFrame++;
            elapsedTime = 0;
        }
    }