summaryrefslogtreecommitdiffstats
path: root/src/splash.c
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-02 20:50:54 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-02 21:11:39 (EDT)
commit6f4631c8f82a2a631730767cad70c0b6ae02e0ad (patch)
tree7e1935f684c6dc84e8e626797e2f7fd4c9b3564f /src/splash.c
parent947c9712a31c8031d1045e34b222384613cfa9b4 (diff)
downloadmazefight-6f4631c8f82a2a631730767cad70c0b6ae02e0ad.zip
mazefight-6f4631c8f82a2a631730767cad70c0b6ae02e0ad.tar.gz
mazefight-6f4631c8f82a2a631730767cad70c0b6ae02e0ad.tar.bz2
splash: New (WIP) screen
Diffstat (limited to 'src/splash.c')
-rw-r--r--src/splash.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/splash.c b/src/splash.c
new file mode 100644
index 0000000..f662a0d
--- /dev/null
+++ b/src/splash.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2021 P. J. McDermott
+ *
+ * This file is part of Maze Fight
+ *
+ * Maze Fight is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Maze Fight is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Maze Fight. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <SDL.h>
+#include <SDL_ttf.h>
+#include <stdlib.h>
+#include <time.h>
+#include "defs.h"
+#include "dirs.h"
+#include "maze.h"
+#include "splash.h"
+#include "util.h"
+
+static SDL_Texture *
+_mf_splash_text(TTF_Font *font, const char *text, SDL_Color *color,
+ SDL_Renderer *renderer, SDL_Rect *rect)
+{
+ SDL_Surface *surface;
+ SDL_Texture *texture;
+
+ surface = TTF_RenderUTF8_Blended(font, text, *color);
+ if (surface == NULL) {
+ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
+ "Couldn't create surface: %s",
+ TTF_GetError());
+ return NULL;
+ }
+
+ texture = SDL_CreateTextureFromSurface(renderer, surface);
+ if (texture == NULL) {
+ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
+ "Couldn't create texture: %s",
+ SDL_GetError());
+ return NULL;
+ }
+
+ rect->w = surface->w;
+ rect->h = surface->h;
+
+ SDL_FreeSurface(surface);
+
+ return texture;
+}
+
+int
+mf_splash(SDL_Renderer *renderer)
+{
+ char *font_path;
+ SDL_Color text_color;
+ TTF_Font *font;
+ SDL_Rect title_rect;
+ SDL_Texture *title_texture;
+ SDL_Rect form_rect;
+ struct mf_maze *maze;
+ SDL_Color maze_color;
+ SDL_Event event;
+
+ font_path = mf_strcat(mf_get_fonts_dir(), "/FifteenTwenty-Regular.ttf");
+
+ text_color.r = MF_COLOR_FORE_R;
+ text_color.g = MF_COLOR_FORE_G;
+ text_color.b = MF_COLOR_FORE_B;
+ text_color.a = MF_COLOR_FORE_A;
+
+ /* Render title text */
+ font = TTF_OpenFont(font_path, MF_SPLASH_TITLE_FONT_S);
+ if (font == NULL) {
+ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
+ "Couldn't open font: %s",
+ TTF_GetError());
+ free(font_path);
+ return -1;
+ }
+ title_texture = _mf_splash_text(font, "Maze Fight", &text_color,
+ renderer, &title_rect);
+ if (title_texture == NULL) {
+ goto err;
+ }
+ TTF_CloseFont(font);
+ font = NULL;
+ title_rect.x = (MF_WINDOW_W - title_rect.w) / 2;
+ title_rect.y = MF_SPLASH_WINDOW_P + MF_SPLASH_FORM_P;
+
+ /* TODO: Widgets */
+
+ /* TODO: Size to widgets and center in window */
+ form_rect.x = MF_SPLASH_WINDOW_P;
+ form_rect.y = MF_SPLASH_WINDOW_P;
+ form_rect.w = MF_WINDOW_W - MF_SPLASH_WINDOW_P*2;
+ form_rect.h = MF_WINDOW_H - MF_SPLASH_WINDOW_P*2;
+
+ free(font_path);
+ font_path = NULL;
+
+ /* Create maze */
+ maze = mf_maze_new(time(NULL),
+ MF_WINDOW_W / MF_SPLASH_MAZE_CELL_W,
+ MF_WINDOW_H / MF_SPLASH_MAZE_CELL_W);
+ if (maze == NULL) {
+ goto err;
+ }
+ maze_color.r = MF_COLOR_MAZE_R;
+ maze_color.g = MF_COLOR_MAZE_G;
+ maze_color.b = MF_COLOR_MAZE_B;
+ maze_color.a = MF_COLOR_MAZE_A;
+
+ SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
+
+ while (SDL_WaitEvent(&event)) {
+ switch (event.type) {
+ case SDL_QUIT:
+ goto quit;
+ default:
+ break;
+ }
+ SDL_SetRenderDrawColor(renderer,
+ MF_COLOR_BACK_R, MF_COLOR_BACK_G,
+ MF_COLOR_BACK_B, MF_COLOR_BACK_A);
+ SDL_RenderClear(renderer);
+ mf_maze_render(maze, renderer, &maze_color,
+ MF_SPLASH_MAZE_CELL_W);
+ SDL_SetRenderDrawColor(renderer,
+ MF_COLOR_FORM_R, MF_COLOR_FORM_G,
+ MF_COLOR_FORM_B, MF_COLOR_FORM_A);
+ SDL_RenderFillRect(renderer, &form_rect);
+ SDL_RenderCopy(renderer, title_texture, NULL, &title_rect);
+ SDL_RenderPresent(renderer);
+ }
+
+ quit:
+ SDL_DestroyTexture(title_texture);
+ title_texture = NULL;
+
+ mf_maze_destroy(&maze);
+
+ return 0;
+
+ err:
+ if (font_path != NULL) {
+ free(font_path);
+ }
+ if (font != NULL) {
+ TTF_CloseFont(font);
+ }
+ if (title_texture != NULL) {
+ SDL_DestroyTexture(title_texture);
+ }
+ return -1;
+}