2012-05-07 7 views
0

現在、xnaでアニメーションを作成しています。 フレームの高さ、幅、および継続時間がすべてのフレームで同じである場合、スプライトシートをアニメーション化するのに問題はありません。Xna異なる高さ、幅のアニメーション

しかし、私は非常に柔軟性がありませんでしたし、同じframeHeight/Widthのスプライトシートを使わずにアニメーション化したいと思います。

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

EDIT: は、私はこのような何かを考えるが、私はそれを動作させることはできません。

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

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

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

+0

一定期間とはどういう意味ですか? xnaのアニメーションはあなたによって制御されます。あなたはどのくらい遅く/速くループするかを選択し、アニメーションの持続時間は何ですか。 –

+0

私はフレームの長さを意味します。 あなたが言ったように、ループ全体を高速または低速に簡単に設定することができます。 しかし、難しいのは、ループ全体でフレームごとに異なる持続時間を設定することです。 – Pilispring

答えて

0

私はこのクラス

公共ボイド更新(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; 
     } 
    }   
1

スプライトシートをアニメーション化する方法はあなた次第です。

Thisチュートリアルでは、4x4スプライトシートでダンスのスマイリーを示しています。 したがって、16個のフレームがあります:あなたが唯一の1,3,5,7,9,11,13,15なくさえ奇数でフレームを使用したい場合は

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

:アニメーションは、()(更新中)に行われ

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

ループを数字枠がcurrentFrame++;の代わりに使用されますcurrentFrame+=2

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

このチュートリアルでは、時間遅延(毎秒または毎秒の更新を意味します)を処理するコントロールがないため、スマイリーのフレームを速やかに更新するようにリンクしました。 5秒)、現在の状態ではDraw()メソッドが60回/秒呼び出されます。

+0

私はあなたが説明したことを完全に理解しています。ほとんどのチュートリアルはそれをうまく説明しました。 私は何をしようとしています: フレーム1の場合:sourcerect(0,0,15,18)frametime = 15 フレーム2の場合:sourcerect(152,58,95,15)frametime = 20 など... – Pilispring

関連する問題