#define MAX_FPS 60
- static void fade_buf(SDL_Surface *screen, int amount)
+ static void fade_buf(SDL_Surface *screen, double fade)
{
int i;
unsigned int *buf = screen->pixels;
unsigned char *b;
+ unsigned char amount;
+ static double threshold;
+ threshold += fade;
+
+ if (threshold > 1) {
+ amount = threshold;
+ threshold -= amount;
+ } else {
+ return;
+ }
- for (i = 0; i < screen->pitch * screen->h / sizeof(*buf); i ++) {
+ for (i = 0; i < screen->pitch * screen->h / sizeof(*buf); i++) {
if (!buf[i])
continue;
b = (unsigned char *)&buf[i];
{
struct timespec tp;
unsigned long ret;
- static unsigned long start = 0;
+ static unsigned long start;
clock_gettime(CLOCK_MONOTONIC, &tp);
case SDLK_a:
time_scale_rate = 1 / 1.5;
break;
+ case SDLK_1:
+ status->time_scale = 1;
+ break;
+ case SDLK_2:
+ status->time_scale = 10;
+ break;
+ case SDLK_3:
+ status->time_scale = 20;
+ break;
+ case SDLK_4:
+ status->time_scale = 30;
+ break;
case SDLK_t:
status->tracers_enabled =
!status->tracers_enabled;
}
break;
case SDL_VIDEORESIZE:
- status->screen = SDL_SetVideoMode(event.resize.w,
- event.resize.h,
- 32,
- status->screen->flags);
+ status->screen =
+ SDL_SetVideoMode(event.resize.w,
+ event.resize.h,
+ 32,
+ status->screen->flags);
break;
case SDL_QUIT:
goto quit;
int last_framecount = 0, last_step_count = 0;
unsigned long old_ticks, ticks = 0, last_frame_tick = 0;
unsigned long step_count = 0;
- double last_fps = 0, last_sps = 0;
+ double last_fps = 0, last_sps = 0, fade_amount;
double step_time = 0, true_time = 0;
init_camera(&camera);
step_count++;
/*
- * Do not draw to the screen more often than MAS_FPS
+ * Do not draw to the screen more often than MAX_FPS
* per second
*/
if (last_frame_tick + (1000 * 1000) / MAX_FPS > ticks)
continue;
- last_frame_tick = ticks;
-
SDL_LockSurface(screen);
if (status.tracers_enabled &&
!camera.speed.x && !camera.speed.y &&
camera.zoom_rate == 1) {
- fade_buf(screen, 10 * true_time);
+ fade_amount = (ticks - last_frame_tick) /
+ (1000 * 1000.0) * 20;
+ fade_buf(screen, fade_amount);
} else {
clear_buf(screen);
}
SDL_Flip(screen);
+ last_frame_tick = ticks;
+
if (last_fps_time + (500 * 1000) < ticks) {
last_framecount = framecount - last_framecount;
last_fps = last_framecount * 1000 * 1000 /