buf[i] = 0;
}
-static int poll_events(SDL_Surface **screen, struct camera *cam)
+static int poll_events(SDL_Surface **screen, struct camera *cam,
+ double *time_scale, double time)
{
+ static double time_scale_rate = 1;
SDL_Event event;
+ *time_scale *= pow(time_scale_rate, time);
+
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYDOWN:
case SDLK_w:
cam->zoom_rate = 1 / CAM_ZOOM_RATE;
break;
+ case SDLK_s:
+ time_scale_rate = 1.5;
+ break;
+ case SDLK_a:
+ time_scale_rate = 1 / 1.5;
+ break;
default:
break;
}
case SDLK_w:
cam->zoom_rate = 1;
break;
+ case SDLK_s:
+ time_scale_rate = 1;
+ break;
+ case SDLK_a:
+ time_scale_rate = 1;
+ break;
default:
break;
}
int planets;
int old_ticks, ticks, framecount = 0, last_fps_time = 0;
int last_framecount = 0;
- double time = 0, last_fps = 0;
+ double time = 0, last_fps = 0, time_scale = 1;
init_camera(&camera);
pl2 = list_to_planet(pl1->list.next);
list_for_each_entry_from(pl2, &planet->list, list) {
struct planet *ptmp;
- if (!gravitize_planets(pl1, pl2, time))
+ if (!gravitize_planets(pl1, pl2,
+ time * time_scale))
continue;
ptmp = list_to_planet(pl2->list.prev);
pl2 = ptmp;
}
- move_planet(pl1, time);
+ move_planet(pl1, time * time_scale);
}
SDL_LockSurface(screen);
move_camera(&camera, time);
- if (poll_events(&screen, &camera))
+ if (poll_events(&screen, &camera, &time_scale, time))
return;
old_ticks = ticks;
last_framecount = framecount;
last_fps_time = ticks;
}
- printf(" \rFrames/s: %.2f, Frame: %d, planets: %d",
- last_fps, framecount++, planets);
+ printf(" \rFrames/s: %.2f, Frame: %d, planets: %d"
+ ", scale %.2f, zoom %.2f",
+ last_fps, framecount++, planets, time_scale,
+ camera.zoom);
}
}