0

現在、xnaでアニメーションを作成しています。フレームの高さ、幅、長さがすべてのフレームで同じであれば、スプライトシートをアニメーション化するのに問題はありません。

しかし、私はそれがあまり柔軟であるとは思いませんでした。同じframeHeight / Widthのスプライトシートなしで、さらに重要なことに一定の期間なしでアニメーション化したいと思います。

これを学ぶためのチュートリアルやコードサンプルはありますか?

編集:私はこのようなものを考えていますが、それを機能させることはできません:

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

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

難しいのは、各フレームの新しい位置と新しいフレーム時間を正確に指定する方法です。

4

2 に答える 2

1

スプライトシートをどのようにアニメーション化するかは、実際にはあなた次第です。

このチュートリアルでは、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

フレームの高さ/幅が異なるスプライトシートの場合は、スケーリングを使用できます。スプライトシートをどのようにナビゲートするかはあなた次第です。つまり、同じ高さ/幅のスプライトシートに制限されることはありません。

期間については、リンクしたチュートリアルで、時間遅延(1秒ごとまたは0.5秒ごとに更新することを意味する)を処理するためのコントロールが実装されていないため、スマイリーのフレームを可能な限り高速に更新します。現在の状態では、Draw()メソッドは1秒間に60回呼び出されます。

于 2012-05-07T22:16:10.520 に答える
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;
        }
    }        
于 2012-05-08T19:54:55.757 に答える