You should use delta time for stuff like that! It may not run at exactly 1200 fps on other computers! The play and loop constants only affect how the frames are interpolated. When using the _play constants, it will not interpolate between the final frame and the first frame, so it doesn't "loop around". Still, if you let the time argument go above 1, the animation will start over. When using the _loop constants, the animation will be entirely smooth and it will interpolate between the final and first frames. The reason it goes all the way up to 19 is because of the final argument in smf_sample_create: Code: anim_final = smf_sample_create(anim, SMF_loop_quadratic, frac(anim_frame / 20)); Notice the frac(anim_frame / 20) part. If you want it to go from 0 to 1, replace that part with just frac(anim_frame);.