From 7a06de57bc7c0f0f71ea5ef51de73dad204d8e0d Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Thu, 18 Mar 2021 17:54:45 -0400 Subject: main-menu: Render game names and descriptions --- (limited to 'src/main-menu.c') diff --git a/src/main-menu.c b/src/main-menu.c index 7b724a1..025ffd9 100644 --- a/src/main-menu.c +++ b/src/main-menu.c @@ -60,11 +60,15 @@ db_main_menu(void) char *font_path; SDL_Renderer *renderer; SDL_Color text_color; + SDL_Color over_color; SDL_Rect dest_rect; TTF_Font *font; SDL_Texture *texture_title; struct db_game **games; int n; + char *name_desc; + SDL_Texture **texture_games_text; + SDL_Texture **texture_games_over; int i; games_dir = db_get_games_dir(); @@ -81,6 +85,11 @@ db_main_menu(void) text_color.b = 0xFF; text_color.a = 0xFF; + over_color.r = 0xFF; + over_color.g = 0xFF; + over_color.b = 0xFF; + over_color.a = 0xFF; + /* Render title text */ font = TTF_OpenFont(font_path, 48); if (font == NULL) { @@ -91,30 +100,89 @@ db_main_menu(void) texture_title = _db_main_menu_text(font, "Dodge Balls", &text_color, 0, renderer, &dest_rect); if (texture_title == NULL) { - free(font_path); - TTF_CloseFont(font); - return; + n = 0; + goto err; } dest_rect.x = 16; dest_rect.y = 16; SDL_RenderCopy(renderer, texture_title, NULL, &dest_rect); SDL_DestroyTexture(texture_title); + TTF_CloseFont(font); + font = TTF_OpenFont(font_path, 16); + if (font == NULL) { + db_err("Failed to open font (%s)", TTF_GetError()); + free(font_path); + return; + } + /* Find games */ n = db_games_find(games_dir, &games); if (n > 0) { - printf("%d games:\n", n); + texture_games_text = calloc(n, sizeof(*texture_games_text)); + if (texture_games_text == NULL) { + goto err; + } + texture_games_over = calloc(n, sizeof(*texture_games_over)); + if (texture_games_over == NULL) { + goto err; + } for (i = 0; i < n; ++i) { - printf("\t%s - %s\n", db_game_get_name(games[i]), + name_desc = malloc((strlen(db_game_get_name(games[i])) + + strlen(db_game_get_desc( + games[i])) + 2) + * sizeof(*name_desc)); + if (name_desc == NULL) { + db_err("Failed to allocate memory"); + goto err; + } + sprintf(name_desc, "%s\n%s", db_game_get_name(games[i]), db_game_get_desc(games[i])); - db_game_free(games[i]); + texture_games_text[i] = _db_main_menu_text(font, + name_desc, &text_color, 608, renderer, + &dest_rect); + if (texture_games_text[i] == NULL) { + free(name_desc); + goto err; + } + dest_rect.x = 16; + dest_rect.y = 80 + 32 * i; + SDL_RenderCopy(renderer, texture_games_text[i], NULL, + &dest_rect); + texture_games_over[i] = _db_main_menu_text(font, + name_desc, &over_color, 608, renderer, + &dest_rect); + free(name_desc); + if (texture_games_over[i] == NULL) { + goto err; + } } - free(games); } SDL_RenderPresent(renderer); SDL_Delay(1000); + err: + if (n > 0) { + for (i = 0; i < n; ++i) { + db_game_free(games[i]); + if (texture_games_text != NULL && + texture_games_text[i] != NULL) { + free(texture_games_text[i]); + } + if (texture_games_over != NULL && + texture_games_over[i] != NULL) { + free(texture_games_over[i]); + } + } + if (texture_games_text != NULL) { + free(texture_games_text); + } + if (texture_games_over != NULL) { + free(texture_games_over); + } + free(games); + } free(font_path); TTF_CloseFont(font); } -- cgit v0.9.1