summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2022-01-27 05:08:23 (EST)
committer P. J. McDermott <pj@pehjota.net>2022-01-27 05:08:23 (EST)
commit9d331d766c9093c4c003d6b3629a9f1c69b08174 (patch)
tree252156ae6f56c8353f71994addf0dc4a88350fdb
parenta6908296b6ac83ab3eb5474ad6b4a509c8f5099c (diff)
downloadmazefight-9d331d766c9093c4c003d6b3629a9f1c69b08174.zip
mazefight-9d331d766c9093c4c003d6b3629a9f1c69b08174.tar.gz
mazefight-9d331d766c9093c4c003d6b3629a9f1c69b08174.tar.bz2
menu: Render at 30 fps, not just on input events
This is necessary to blink the text cursor.
-rw-r--r--src/menu.c58
1 files changed, 39 insertions, 19 deletions
diff --git a/src/menu.c b/src/menu.c
index b03ab8b..b171d2b 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -226,7 +226,11 @@ mf_menu(SDL_Renderer *renderer)
TTF_Font *title_font = NULL;
TTF_Font *text_font = NULL;
struct mftk_window *win = NULL;
+ int fr;
+ Uint32 beg;
SDL_Event event;
+ Uint32 end;
+ Uint32 delay;
/* Create maze */
maze = mf_maze_new(time(NULL),
@@ -285,27 +289,31 @@ mf_menu(SDL_Renderer *renderer)
SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
- while (SDL_WaitEvent(&event)) {
- switch (event.type) {
- case SDL_QUIT:
- goto quit;
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym) {
- case SDLK_ESCAPE:
- goto quit;
+ fr = 10;
+ while(1) {
+ beg = SDL_GetTicks();
+ while (SDL_PollEvent(&event)) {
+ switch (event.type) {
+ case SDL_QUIT:
+ goto quit;
+ case SDL_KEYDOWN:
+ switch (event.key.keysym.sym) {
+ case SDLK_ESCAPE:
+ goto quit;
+ default:
+ break;
+ }
default:
break;
- }
- default:
- break;
- }
- switch (mftk_window_event(win, &event)) {
- case 0:
- break;
- case 1:
- goto quit;
- default:
- goto err;
+ }
+ switch (mftk_window_event(win, &event)) {
+ case 0:
+ break;
+ case 1:
+ goto quit;
+ default:
+ goto err;
+ }
}
SDL_SetRenderDrawColor(renderer,
MF_COLOR_BACK_R, MF_COLOR_BACK_G,
@@ -315,6 +323,18 @@ mf_menu(SDL_Renderer *renderer)
MF_MENU_MAZE_CELL_W);
mftk_window_render(win, renderer);
SDL_RenderPresent(renderer);
+ end = SDL_GetTicks();
+ if ((Uint32) (1000 / fr) > (end - beg)) {
+ delay = 1000 / fr - (end - beg);
+ } else {
+ SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
+ "Frame took longer than frame period");
+ delay = 0;
+ }
+ SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION,
+ "Frame took %u ms, delaying %u ms",
+ end - beg, delay);
+ SDL_Delay(delay);
}
quit: