чување 5ef6fe89d46ab8e3bbacf869d49d822f8ba64855
родитељ 0591ce4e2739043d764b7e719d71b05c1a1c6d00
Аутор: Страхиња Радић <sr@strahinja.org>
Датум: Thu, 10 Jul 2025 15:00:20 +0200
Restructure animation logic (fixed numbers => FPS, speed); draw status at screen bottom
Diffstat:
| M | lav-sdl.c | | | 45 | ++++++++++++++++++++++++++++++--------------- |
измењених датотека: 1, додавања: 30(+), брисања: 15(-)
diff --git a/lav-sdl.c b/lav-sdl.c
@@ -12,7 +12,12 @@
#include "local.h"
-#define ANIM_STEPS 10
+#define ANIM_SPEED \
+ 100 /* how long does it take for the animation to go \
+ * from start to finish (ms) */
+#define FPS 60
+#define ANIM_STEPS (ANIM_SPEED * FPS / 1000)
+
#define BUFSIZE 4096
#define CELL_SIZE 32
#define DEFAULT_WIDTH 1280
@@ -24,7 +29,6 @@
#define LOCATION_STACK_MAX (LABYRINTH_MAXWIDTH * LABYRINTH_MAXHEIGHT)
#define PRINT_BUFSIZE 4096
#define PROGNAME "lav-sdl"
-#define SEARCHING_DELAY 5
#define TER12_WIDTH 6
#define TER12_HEIGHT 12
#define WIN_TITLE "Lavirint (SDL version)"
@@ -270,8 +274,9 @@ draw(void)
SDL_RenderTexture(renderer, sprites, &cell_rect, &dest_rect);
/* Render status */
- draw_text(startx, starty + bg_rect.h, TER12_WIDTH, TER12_HEIGHT,
- ter12_texture,
+ // draw_text(startx, starty + bg_rect.h, TER12_WIDTH, TER12_HEIGHT,
+ draw_text(0, screen_height - text_scale_factor * TER12_HEIGHT,
+ TER12_WIDTH, TER12_HEIGHT, ter12_texture,
"Column: %2d, Row: %2d F1 = Help Status: %s", hero.x + 1,
hero.y + 1, state_descriptions[state]);
@@ -910,6 +915,7 @@ main(int argc, char** argv)
{
SDL_Event event;
float px, py;
+ unsigned int last_time, current_time;
char datafile_pathname[BUFSIZE];
atexit(&cleanup);
@@ -921,16 +927,17 @@ main(int argc, char** argv)
}
if (!SDL_CreateWindowAndRenderer(WIN_TITLE, DEFAULT_WIDTH,
- DEFAULT_HEIGHT, SDL_WINDOW_MAXIMIZED | SDL_WINDOW_RESIZABLE,
- &window, &renderer))
+ DEFAULT_HEIGHT,
+ SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS, &window,
+ &renderer))
{
print_error("SDL_CreateWindowAndRenderer failed: %s",
SDL_GetError());
exit(1);
}
- SDL_SetWindowFullscreenMode(window, NULL);
- SDL_SetWindowFullscreen(window, 1);
+ // SDL_SetWindowFullscreenMode(window, NULL);
+ // SDL_SetWindowFullscreen(window, 1);
SDL_SetHintWithPriority(SDL_HINT_RENDER_VSYNC, "1", SDL_HINT_OVERRIDE);
SDL_SetRenderLogicalPresentation(renderer, DEFAULT_WIDTH,
DEFAULT_HEIGHT, SDL_LOGICAL_PRESENTATION_LETTERBOX);
@@ -946,7 +953,11 @@ main(int argc, char** argv)
if (argc > 1)
{
if (load_labyrinth(*(argv + 1)) < 0)
+ {
+ print_error("load_labyrinth failed: %s (%s)",
+ strerror(errno), *(argv + 1));
exit(1);
+ }
}
else
{
@@ -975,15 +986,18 @@ main(int argc, char** argv)
SDL_GetMouseState(&px, &py);
pointer.x = px;
pointer.y = py;
+ last_time = SDL_GetTicks();
while (running)
{
- while (SDL_PollEvent(&event))
- handle_event(&event);
-
+ current_time = SDL_GetTicks();
if (animation.active)
{
- draw();
- step_animation();
+ if (current_time > last_time + 1000 / 60)
+ {
+ draw();
+ step_animation();
+ last_time = current_time;
+ }
}
else
{
@@ -998,8 +1012,9 @@ main(int argc, char** argv)
redraw = 0;
}
}
- /* TODO: More sophisticated framerate/vsync/delay handling */
- SDL_Delay(SEARCHING_DELAY);
+
+ while (SDL_PollEvent(&event))
+ handle_event(&event);
}
return 0;