Jump to content

  • Log In with Google      Sign In   
  • Create Account

XNA Sprite Frame Inconsistency


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 Sasstraliss   Members   -  Reputation: 105

Like
0Likes
Like

Posted 15 September 2012 - 11:41 PM

I have an explosion sprite, with 16 frames.


Everytime the player collides with an asteroid, the gamestate is set to loseScreen, and when the loseScreen is the gamestate, the lose() function is continually called until the gamestate changes.

Inside the lose() function, this code draws the animated spritesheet, which runs through the 16 frame animation. It should always start from frame 0, but it doesn't always. Sometimes it starts at frame 10, and only runs for 6 frames before finishing. That's the issue. The code inside the lose() function to draw the explosion animation is as follows:


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;


The time variable is as follows, it gets the total elapsed game time.

time = (float)gameTime.TotalGameTime.TotalSeconds;

I've tried changing TotalGameTime to ElapsedGameTime, nothing changed.
It's the following line from the lose() function that I believe is the issue, perhaps:

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

It works, and it animates. However it doesn't always start at frame 0. it starts from random frames between 0 and 16, but it still runs correctly at 16 frames per second.

So, how do I get it to always start from frame 0?


Would I solve my issue by making a new time variable that starts a timer from 0 only when the lose() function is called? How do I do that?

Sponsor:

#2 Arthur Souza   Members   -  Reputation: 1418

Like
0Likes
Like

Posted 16 September 2012 - 03:49 AM

Well, you are using the total elapsed amount of game time in seconds to determine which frame is going to be drawn. I would use a timer to wait before going to the next frame, it would go something like this

// members
expFrameID = 0;
timer = 0;
UpdateAnimation()
{
// ElapsedGametime gets how long has it been since the last update
timer += (int) GameTimer.ElapsedGameTime.TotalMilisseconds;
if(timer >= 60) // Because you want 16 frames persecond at least, correct? So 60ms I guess.
{
  timer = 0;
  if(expFrameID == 15)
	 expFrameID  = 0;
  else
	 expFrameID++;
}

Rectangle expRect = new Rectangle(expFrameID * expFrameWidth, 0, 63, 63);
if (expFrameID == 15)
{
  expIsDrawn = true;
}
}
Draw()
{
  spriteBatch.Draw(explosion, shipLocation, expRect, Color.White, 0f, new Vector2(32, 32), 1.0f, pickupSpriteEffects, 0.1f);
}

Edited by Arthur Souza, 16 September 2012 - 03:51 AM.

A.

Lotus - Action RPG In development http://www.gamedev.n...die-rpg-engine/ |
Personal blog In Portuguese: lotuzgames.wordpress.com |





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS