lav-sdl

SDL верзија програма Лавиринт
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 538f50e5d4a2b9263048f0232e55a3d360d2739c
родитељ 14c2f393c94d331fa10aaf34c92e276da47aed08
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Fri, 18 Aug 2023 11:11:30 +0200

Cleanup, optimization

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mlav-sdl.c | 135++++++++++++++++++++++++++++++++++++++++++-------------------------------------
измењених датотека: 1, додавања: 72(+), брисања: 63(-)

diff --git a/lav-sdl.c b/lav-sdl.c @@ -116,6 +116,8 @@ void assign_point_xyIF(const int x, const int y, SDL_FPoint* to); void calculate_delta(void); void cleanup(void); void draw(void); +void draw_background(SDL_Rect* bg_rect, SDL_Rect* cell_rect, + SDL_FRect* dest_rect); void draw_help_dialog(void); void draw_text(const int x, const int y, const int font_width, const int font_height, SDL_Texture* font_tex, const char* text, ...); @@ -135,6 +137,7 @@ int passable(const int x, const int y); void print_debug(const char* fmt, ...); void print_error(const char* fmt, ...); void reset(void); +void step_animation(void); void update_size(void); void @@ -194,7 +197,6 @@ draw(void) { SDL_Rect bg_rect, cell_rect; SDL_FRect dest_rect; - SDL_DisplayMode mode; int x, y; int cx, cy; float startx, starty; @@ -218,48 +220,7 @@ draw(void) /* Render background */ if (!background) - { - if (SDL_GetCurrentDisplayMode(0, &mode) < 0) - { - print_error("SDL_GetCurrentDisplayMode failed: %s", - SDL_GetError()); - exit(1); - } - - background = SDL_CreateTexture(renderer, mode.format, - SDL_TEXTUREACCESS_TARGET, bg_rect.w, bg_rect.h); - if (!background) - { - print_error("SDL_CreateTextureFromSurface failed: %s", - SDL_GetError()); - exit(1); - } - if (SDL_SetRenderTarget(renderer, background) < 0) - { - print_error("SDL_SetRenderTarget failed: %s", - SDL_GetError()); - exit(1); - } - - SDL_SetRenderDrawColor(renderer, 0x22, 0x22, 0x22, - SDL_ALPHA_OPAQUE); - SDL_RenderFillRect(renderer, &bg_rect); - - dest_rect.w = CELL_SIZE * scale_factor; - dest_rect.h = CELL_SIZE * scale_factor; - for (y = 0; y < labyrinth.height; y++) - for (x = 0; x < labyrinth.width; x++) - { - get_sprite_xy(labyrinth.cells[y][x], - &cell_rect.x, &cell_rect.y); - labyrinth_coord_to_screen_coord(x, y, 0.0f, - 0.0f, &dest_rect.x, &dest_rect.y); - SDL_RenderCopyF(renderer, sprites, &cell_rect, - &dest_rect); - } - - SDL_SetRenderTarget(renderer, NULL); - } + draw_background(&bg_rect, &cell_rect, &dest_rect); /* Draw buffered copy of background */ dest_rect.x = startx; @@ -288,13 +249,9 @@ draw(void) &dest_rect); } - /* Render hero */ - cell_rect.w = CELL_SIZE; - cell_rect.h = CELL_SIZE; - + /* Draw hero */ dest_rect.w = CELL_SIZE * scale_factor; dest_rect.h = CELL_SIZE * scale_factor; - get_hero_sprite_xy(&cell_rect.x, &cell_rect.y); if (animation.active) labyrinth_coord_to_screen_coordF(animation.position.x, @@ -303,22 +260,8 @@ draw(void) else labyrinth_coord_to_screen_coord(hero.x, hero.y, startx, starty, &dest_rect.x, &dest_rect.y); - SDL_RenderCopyF(renderer, sprites, &cell_rect, &dest_rect); - if (animation.active) - { - animation.position.x += animation.delta.x; - animation.position.y += animation.delta.y; - animation.step++; - if (animation.step == animation.final_step) - { - animation.active = 0; - hero.x = (int)animation.destination.x; - hero.y = (int)animation.destination.y; - } - } - /* Render status */ draw_text(startx, starty + bg_rect.h, TER16_WIDTH, TER16_HEIGHT, ter16_texture, @@ -329,7 +272,56 @@ draw(void) draw_help_dialog(); SDL_RenderPresent(renderer); - // SDL_RenderFlush(renderer); +} + +void +draw_background(SDL_Rect* bg_rect, SDL_Rect* cell_rect, SDL_FRect* dest_rect) +{ + SDL_DisplayMode mode; + + if (SDL_GetCurrentDisplayMode(0, &mode) < 0) + { + print_error("SDL_GetCurrentDisplayMode failed: %s", + SDL_GetError()); + exit(1); + } + + background = SDL_CreateTexture(renderer, mode.format, + SDL_TEXTUREACCESS_TARGET, bg_rect->w, bg_rect->h); + if (!background) + { + print_error("SDL_CreateTextureFromSurface failed: %s", + SDL_GetError()); + exit(1); + } + if (SDL_SetRenderTarget(renderer, background) < 0) + { + print_error("SDL_SetRenderTarget failed: %s", SDL_GetError()); + exit(1); + } + + SDL_SetRenderDrawColor(renderer, 0x22, 0x22, 0x22, SDL_ALPHA_OPAQUE); + SDL_RenderFillRect(renderer, bg_rect); + + dest_rect->w = CELL_SIZE * scale_factor; + dest_rect->h = CELL_SIZE * scale_factor; + for (int y = 0; y < labyrinth.height; y++) + for (int x = 0; x < labyrinth.width; x++) + { + if (!((labyrinth.cells[y][x] != CELL_OK + && labyrinth.cells[y][x] != CELL_FAIL) + || (x == start.x && y == start.y) + || (x == end.x && y == end.y))) + continue; + + get_sprite_xy(labyrinth.cells[y][x], &cell_rect->x, + &cell_rect->y); + labyrinth_coord_to_screen_coord(x, y, 0.0f, 0.0f, + &dest_rect->x, &dest_rect->y); + SDL_RenderCopyF(renderer, sprites, cell_rect, dest_rect); + } + + SDL_SetRenderTarget(renderer, NULL); } void @@ -867,6 +859,20 @@ reset(void) } void +step_animation(void) +{ + animation.position.x += animation.delta.x; + animation.position.y += animation.delta.y; + animation.step++; + if (animation.step == animation.final_step) + { + animation.active = 0; + hero.x = (int)animation.destination.x; + hero.y = (int)animation.destination.y; + } +} + +void update_size(void) { float factor1; @@ -933,7 +939,10 @@ main(int argc, char** argv) handle_event(&event); if (animation.active) + { draw(); + step_animation(); + } else { if (state == STATE_SEARCHING)