# HG changeset patch # User David Demelier # Date 1579123877 -3600 # Node ID e10fd1b6323f999fa3fa1441424f9ca4e5a3869a # Parent c97fe725fdeb6a1507b127fdf24795f6d7fee714 core: implement splashscreen, closes #2458 @1h diff -r c97fe725fdeb -r e10fd1b6323f Makefile --- a/Makefile Wed Jan 15 21:31:17 2020 +0100 +++ b/Makefile Wed Jan 15 22:31:17 2020 +0100 @@ -36,6 +36,7 @@ src/sys.c \ src/texture.c \ src/util.c \ + src/splashscreen.c \ src/walksprite.c \ src/window.c OBJS= ${SRCS:.c=.o} diff -r c97fe725fdeb -r e10fd1b6323f assets/fonts/knights-quest.ttf Binary file assets/fonts/knights-quest.ttf has changed diff -r c97fe725fdeb -r e10fd1b6323f src/game.c --- a/src/game.c Wed Jan 15 21:31:17 2020 +0100 +++ b/src/game.c Wed Jan 15 22:31:17 2020 +0100 @@ -16,6 +16,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include "game.h" @@ -27,6 +28,14 @@ }; void +game_switch(struct state *state) +{ + assert(state); + + game.state_next = state; +} + +void game_handle(const union event *event) { if (game.state) @@ -44,6 +53,7 @@ game.state = game.state_next; game.state->enter(); + game.state_next = NULL; } if (game.state) diff -r c97fe725fdeb -r e10fd1b6323f src/game.h --- a/src/game.h Wed Jan 15 21:31:17 2020 +0100 +++ b/src/game.h Wed Jan 15 22:31:17 2020 +0100 @@ -43,6 +43,17 @@ extern struct game game; /** + * Request to change state. + * + * This function will only update state after the next \a game_update call. + * + * \pre state != NULL + * \param state the new state + */ +void +game_switch(struct state *state); + +/** * Handle input event. * * \param event the event diff -r c97fe725fdeb -r e10fd1b6323f src/main.c --- a/src/main.c Wed Jan 15 21:31:17 2020 +0100 +++ b/src/main.c Wed Jan 15 22:31:17 2020 +0100 @@ -17,9 +17,10 @@ */ #include "clock.h" -#include "game.h" #include "error.h" #include "event.h" +#include "game.h" +#include "splashscreen.h" #include "sys.h" #include "window.h" @@ -33,6 +34,9 @@ error_fatal(); if (!window_init("Molko's Adventure", WINDOW_WIDTH, WINDOW_HEIGHT)) error_fatal(); + + /* Default state is splash screen */ + game_switch(&splashscreen_state); } static void diff -r c97fe725fdeb -r e10fd1b6323f src/splashscreen.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/splashscreen.c Wed Jan 15 22:31:17 2020 +0100 @@ -0,0 +1,97 @@ +/* + * splashscreen.c -- splash screen state + * + * Copyright (c) 2020 David Demelier + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include // TODO: temporary + +#include "error.h" +#include "font.h" +#include "painter.h" +#include "splashscreen.h" +#include "state.h" +#include "sys.h" +#include "texture.h" +#include "window.h" + +#define DELAY 5000 + +static unsigned int elapsed; +static struct font *font; +static struct texture *text; +static int x; +static int y; + +static void +enter(void) +{ + if (!(font = font_openf(sys_datapath("fonts/knights-quest.ttf"), 100))) + error_fatal(); + if (!(text = font_render(font, "Molko's Adventure", 0x000000ff))) + error_fatal(); + + /* Compute position. */ + uint16_t w = 0; + uint16_t h = 0; + + if (!texture_get_size(text, &w, &h)) + error_fatal(); + + x = (window_width() / 2) - (w / 2); + y = (window_height() / 2) - (h / 2) - 100; +} + +static void +leave(void) +{ + font_close(font); +} + +static void +handle(const union event *event) +{ + (void)event; +} + +static void +update(unsigned int ticks) +{ + elapsed += ticks; + + /* TODO: change this once map is done. */ + if (elapsed >= DELAY) { + printf("splash finished!"); + exit(0); + } +} + +static void +draw(void) +{ + painter_set_color(0xffffffff); + painter_clear(); + texture_draw(text, x, y); + painter_present(); +} + +struct state splashscreen_state = { + .enter = enter, + .leave = leave, + .handle = handle, + .update = update, + .draw = draw +}; diff -r c97fe725fdeb -r e10fd1b6323f src/splashscreen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/splashscreen.h Wed Jan 15 22:31:17 2020 +0100 @@ -0,0 +1,32 @@ +/* + * splashscreen.h -- splash screen state + * + * Copyright (c) 2020 David Demelier + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef MOLKO_SPLASHSCREEN_H +#define MOLKO_SPLASHSCREEN_H + +/** + * \file splashscreen.h + * \brief Splash screen state. + */ + +/** + * \brief Splash screen state. + */ +extern struct state splashscreen_state; + +#endif /* !MOLKO_SPLASHSCREEN_H */ diff -r c97fe725fdeb -r e10fd1b6323f src/window.c --- a/src/window.c Wed Jan 15 21:31:17 2020 +0100 +++ b/src/window.c Wed Jan 15 22:31:17 2020 +0100 @@ -44,6 +44,26 @@ return true; } +unsigned +window_width(void) +{ + int width; + + SDL_GetWindowSize(win.win, &width, NULL); + + return width; +} + +unsigned +window_height(void) +{ + int height; + + SDL_GetWindowSize(win.win, NULL, &height); + + return height; +} + void window_close(void) { diff -r c97fe725fdeb -r e10fd1b6323f src/window.h --- a/src/window.h Wed Jan 15 21:31:17 2020 +0100 +++ b/src/window.h Wed Jan 15 22:31:17 2020 +0100 @@ -39,6 +39,22 @@ window_init(const char *title, unsigned width, unsigned height); /** + * Get the current window's width. + * + * \return the width + */ +unsigned +window_width(void); + +/** + * Get the current window's height. + * + * \return the height + */ +unsigned +window_height(void); + +/** * Close the window and destroy associated resources. */ void