1

私はキャラクターを走らせていますが、私がやっているようにアニメーションは非常に速いです:

_frameIndex++;

_frameIndex;SpriteSheet 内の画像を指す値です。gameTime.ElapsedGameTime.TotalMillisecondsアニメーションを遅くする方法を知っている人はいますか?

4

2 に答える 2

3

今夜、アニメーションとスプライトシートに関していくつか質問があったので、第3章の「アニメーション速度の調整」の見出しにあるアーロンリードの「 LearningXNA4.0 」の例を次に示します。

まず、アニメーションフレーム間の時間を追跡するために、2つのクラスレベルの変数を作成します。

int timeSinceLastFrame = 0;
int millisecondsPerFrame = 50;

最初の変数は、アニメーションフレームが変更されてから経過した時間を追跡し、2番目の変数は、フレームインデックスを再度移動する前に待機するように指定した任意の時間です。したがって、millisecondsPerFrame小さくするとアニメーション速度が速くなり、大きくするとアニメーション速度が遅くなります。

これで、updateメソッドでgame.ElapsedGameTime、最後のフレーム変更から経過した時間をチェックし、その値がmsirsPerFrameより大きいときにフレームを変更できるようになり、次の作業を実行できます。

timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
if (timeSinceLastFrame > millisecondsPerFrame){
    timeSinceLastFrame -= millisecondsPerFrame;
    // Increment Current Frame here (See link for implementation)
}

この種の解決策は、アニメーションを更新する頻度を正確に指定するための追加の手順を実行したり、必要に応じてコードの後半でその期間を変更したりできることを除いて、機能するものと似ています。たとえば、スプライトを「スピードアップ」する(パワーアップなど)、または同様にスローダウンする条件がある場合は、を変更することでこれを行うことができますmillisecondsPerFrame

現在のフレームを実際に更新するコードを削除しました。これは、アニメーションが機能しているので、それを実行する何かがすでにあるはずだからです。例を完全に見たい場合は、教科書のWebサイトからダウンロードできます。

于 2013-03-24T03:26:21.583 に答える
1

gameTime.ElapsedGameTime.TotalMillisecondsコードをデバッグしたところ、 が常に 33 に等しいことに気付きました。そのため、次のことを行いました。

milliSeconds += gameTime.ElapsedGameTime.Milliseconds; if (milliSeconds > 99) { _frameIndex++; milliSeconds = 0; }

これは基本的に、これがゲームの 3 番目のフレームである場合、_frameIndex を上げることを意味します。ミリ秒をリセットして最初からやり直します。

于 2013-03-24T03:12:56.370 に答える