0

16フレームの爆発スプライトがあります。

プレイヤーが小惑星と衝突するたびに、lose()関数が呼び出されます。

lost()関数内で、このコードは、16フレームのアニメーションを実行するアニメーション化されたスプライトシートを描画します。常にフレーム0から開始する必要がありますが、常にそうであるとは限りません。

        expFrameID = 0;
        expFrameID += (int)(time * expFPS) % expFrameCount;
        Rectangle expRect = new Rectangle(expFrameID * expFrameWidth, 0, 63, 63);
        spriteBatch.Draw(explosion, shipLocation, expRect, Color.White, 0f, new Vector2(32, 32), 1.0f, pickupSpriteEffects, 0.1f);
        if (expFrameID == 15)
            expIsDrawn = true;

時間変数は次のとおりです。ゲームの合計経過時間を取得します。

time = (float)gameTime.TotalGameTime.TotalSeconds;

問題であると私が信じているのは、lose()関数からの次の行です。

expFrameID += (int)(time * expFPS) % expFrameCount;

それは機能し、アニメーション化します。ただし、常にフレーム0で開始するわけではありません。0〜16のランダムなフレームで開始しますが、それでも1秒あたり16フレームで正しく実行されます。

では、どうすれば常にフレーム0から開始することができますか?

4

1 に答える 1

0

アニメーション化されたにもかかわらず、draw メソッドでこのように時間変数を増やしたいと思うかもしれません。

// This will increase time by the milliseconds between update calls.
time += (float)gameTime.ElapsedGameTime.Milliseconds;

次に、次のフレームを表示するのに十分な時間が経過したかどうかを確認します

if(time >= (1f / expFPS * 1000f) //converting frames per second to milliseconds per frame
{
    expFrameID++;
    //set the time to 0 to start counting for the next frame
    time = 0f;
}

次に、スプ​​ライト シートから描画する四角形を取得します。

Rectangle expRect = new Rectangle(expFrameID * expFrameWidth, 0, 63, 63);

次にスプライトを描画します

spriteBatch.Draw(explosion, shipLocation, expRect, Color.White, 0f, new Vector2(32, 32), 1.0f, pickupSpriteEffects, 0.1f);

次に、アニメーションが終了したかどうかを確認します

if(expFrameID == 15)
{
    //set expFrameID to 0
    expFrameID = 0;
    expIsDrawn = true;
}
于 2012-09-17T17:00:41.867 に答える