2012-09-15 111 views
0

我有一個爆炸雪碧,有16幀。XNA雪碧幀不一致

每次玩家碰撞一個小行星,調用lose()函數。

在lost()函數中,此代碼繪製了動畫spritesheet,它貫穿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; 

這是從我相信失去()函數下面一行是問題:

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

它的工作原理,以及它動畫。然而它並不總是從第0幀開始,它從0到16之間的隨機幀開始,但它仍以每秒16幀正確運行。

那麼,如何讓它始終從第0幀開始?

+0

改爲使用'ElapsedGameTime'。在自己的變量中自己累積時間(或幀數)。 –

+0

如何累積時間/幀數? – Sasstraliss

+0

在你的班級中有一個變量,例如「浮動時間」。在你的更新方法中,執行'time + =(float)gameTime.ElapsedGameTime.TotalSeconds'。或者你可以增加一個計數器,無論你在哪裏。 –

回答

0

在您的動畫spite類中,您可能想要在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; 
}