Multi-framerate ... ?

Started by
5 comments, last by m4x30000 14 years, 9 months ago
Hi! I'm currently working on something that I can't figure out... It's a 2D game (using direct3d), and I want to have multiple frame rate for my sprites; what I mean by this is that if a frame is generated 20 times per second, I don't necessarily want my animated sprite to change frame 20 times per second :( It might sound simple but I've been on this for 2 days, I'm exhausted -_- so does anyone have an example of a loop or frame switching mechanisms etc... to achieve this ?? I joined a code snippet... Dropping the frame rate is not an option since there are sprites I want to update that much, but if anyone have a completely other way of doing this I would really appreciate any info ^_^ thanks ! m@x.

void Logic(OBJECT go[], INPUTDATA* id) {

	static int this_time = 0;
	static int last_time = 0;
	static int elapsed_time = 0;

	// These 3 lines are used to know the elapsed time between
	// each frames and store the value in elapsed_time
	this_time = GetTickCount();
	elapsed_time += (this_time - last_time);
	last_time = GetTickCount();

	// 
	if(elapsed_time >= int( 1000 / FRAME_RATE )) {
		// Here I switch the frames etc...
		elapsed_time = 0;
	}

}

Advertisement
Quote:Original post by m4x30000
Hi!

I'm currently working on something that I can't figure out... It's a 2D game (using direct3d), and I want to have multiple frame rate for my sprites; what I mean by this is that if a frame is generated 20 times per second, I don't necessarily want my animated sprite to change frame 20 times per second :( It might sound simple but I've been on this for 2 days, I'm exhausted -_- so does anyone have an example of a loop or frame switching mechanisms etc... to achieve this ?? I joined a code snippet... Dropping the frame rate is not an option since there are sprites I want to update that much, but if anyone have a completely other way of doing this I would really appreciate any info ^_^

thanks !
m@x.

*** Source Snippet Removed ***


you could let each sprite know its framerate and the time since its last switch.

so

thisTime = GetTickCount();frameTime = thisTime-lastTime;lastTime = thisTime;for (int i=0; i<spriteCount;i++) {    sprite.timeSinceLastFrameSwitch+=frameTime;    if (sprite.timeSinceLastFrameSwitch >= 1000 / sprite.frameRate) {        sprite.nextFrame();        sprite.timeSinceLastFrameSwitch -= 1000 / sprite.frameRate);    }}


(Ofcourse its a good idea to use a linked list or vector to store the sprite, and perhaps move the animation code into the sprite class so that you only need to pass the frameTime to the sprites)
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!
You need to look up time-based animation (as opposed to frame-based animation)

I.e don't change your sprite's image based on how many frames have elapsed (in your case it seems to be every frame) but based on how much time has elapsed.

Good luck
My Animation class has a default updateRate of 1, which means that every time there's a sim update, the animation advances 1 frame. I can set it to less than 1 for a slower animation (e.g. sim update 1, animation frame 1, sim update 2, animation frame still 1 (internal 1.5), sim update 3, animation frame 2). Basically the way this works is, every time I update the animation, I advance its 'frame' field by an arbitrary number. When it comes time to draw the animation, I truncate that number to an int, and use it to index into the animation's 'surfaces' field to know what image should be displayed.

I even went a bit overboard and let my Animations use arbitrary functions in their update function, so they can base their update rates on anything they want. For example, I have a running animation whose update rate depends on the horizontal velocity of the object, and a turnaround animation that reverses itself if you press backwards, by returning a negative number.
Jetblade: an open-source 2D platforming game in the style of Metroid and Castlevania, with procedurally-generated levels
This is what I've been using for my animated cursors:
int frame = currentTime - (currentTime/animTimeTotal)*animTimeTotal;
frame = (frame<0)? 0 : Clamp( frame/animTime, 0, animFrames-1 );

Variables (all values are int):
frame - the animations frame to draw
currentTime - obvious
animFrames - number of frames the animation has
animTime = the time (in ms) one frame should be shown ( i.e. 1000/fps )
animTimeTotal = animTime * animFrames
Hi you can try this : -
In your sprite class define two more variables
Delay = minimum number of tickers required to be passed before
updating the frame of the sprite
lasttick = when you update your frame update this lasttick to current value

Here is an example : -

[source = "cpp"]class Sprite{// am skipping other code in sprite classint delay,lasttick;//suppose this is the function updating the frame of your animated spritevoid updateFrame(int currentTick) { if( (currentTick - lasttick) < Delay )  {    return;  }  //code to update frame lasttick = currentTick; }};Sprite spriteobj;//Render Loopvoid Render(){int tick = GetTickCount();spriteobj.updateFrame(tick);}


This may not be the best solution but may be one of the simple ones.

I have found one nice article on Game Loop few days back .
You can refer to that article. However its about making game speed independent of FPS but making some more changes there it can serve your purpose too.

My Game Development Blog : chetanjags.wordpress.com

Thanks a lot guys !

I've been able to make it the easy way ;) adding two more variables (mintick, lasttick) -- but I've gather some cool info on time-based animation and game loops -- It's my first game so these will be very helpful in the future -_^

This topic is closed to new replies.

Advertisement