diff --git a/include/engine.h b/include/engine.h index 964178e..709bbed 100644 --- a/include/engine.h +++ b/include/engine.h @@ -6,16 +6,13 @@ #include #include -#define WINDOW_WIDTH 1280 -#define WINDOW_HEIGHT 720 -#define DEFAULT_WINDOW_NAME "Dangerzone" -#define WINDOW_NAME_LENGTH 128 +#define WINDOW_NAME_MAX_LENGTH 128 #define TARGET_FRAME 1.0 / 60.0 #define FONT_ROWS 7 #define FONT_COLS 5 typedef struct { - char window_name[WINDOW_NAME_LENGTH]; + char window_name[WINDOW_NAME_MAX_LENGTH]; uint16_t width, height; SDL_Window *window; SDL_Renderer *renderer; @@ -38,19 +35,23 @@ typedef struct { } engine_internal_state_t; typedef struct { - uint32_t framebuffer[WINDOW_WIDTH * WINDOW_HEIGHT]; SDL_Event event; bool is_running; bool framebuffer_dirty; SDL_Rect dirty_rect; uint16_t width, height; + uint32_t *framebuffer; } game_state_t; extern engine_internal_state_t *internal_state; extern game_state_t *game_state; engine_sdl_state_t* -engine_sdl_init(); +engine_sdl_init( + uint32_t window_width, + uint32_t window_height, + const char window_name[] +); void engine_sdl_destroy( @@ -59,6 +60,9 @@ engine_sdl_destroy( bool engine_init( + uint32_t window_width, + uint32_t window_height, + const char window_name[], void (*engine_poll_events)(void), void (*engine_update_framebuffer)(void) ); diff --git a/src/engine/engine.c b/src/engine/engine.c index c850365..dda5bb7 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -172,5 +172,6 @@ void engine_stop() { engine_sdl_destroy(internal_state->sdl_state); free(internal_state); - free(game_state); + free(game_state->framebuffer); + free(game_state); } \ No newline at end of file diff --git a/src/engine/engine_init.c b/src/engine/engine_init.c index 556bc64..8e8b65d 100644 --- a/src/engine/engine_init.c +++ b/src/engine/engine_init.c @@ -2,9 +2,15 @@ #include "error.h" #include #include +#include bool -engine_sdl_init_state(engine_sdl_state_t **state) { +engine_sdl_init_state( + engine_sdl_state_t **state, + uint32_t window_width, + uint32_t window_height, + const char window_name[] +) { *state = (engine_sdl_state_t *) malloc(sizeof(engine_sdl_state_t)); @@ -13,12 +19,13 @@ engine_sdl_init_state(engine_sdl_state_t **state) { return RCODE_FAILURE; } - (*state)->width = WINDOW_WIDTH; - (*state)->height = WINDOW_HEIGHT; + (*state)->width = window_width; + (*state)->height = window_height; strncpy( - (*state)->window_name, DEFAULT_WINDOW_NAME, - WINDOW_NAME_LENGTH + (*state)->window_name, window_name, + WINDOW_NAME_MAX_LENGTH - 1 ); + (*state)->window_name[WINDOW_NAME_MAX_LENGTH - 1] = '\0'; return RCODE_SUCCESS; } @@ -94,11 +101,19 @@ engine_sdl_init_texture( } engine_sdl_state_t* -engine_sdl_init() -{ +engine_sdl_init( + uint32_t window_width, + uint32_t window_height, + const char window_name[] +) { engine_sdl_state_t *state; - if (!engine_sdl_init_state(&state) || + if (!engine_sdl_init_state( + &state, + window_width, + window_height, + window_name + ) || !engine_sdl_init_root() || !engine_sdl_init_window(state) || !engine_sdl_init_renderer(state) || @@ -127,6 +142,9 @@ engine_sdl_destroy( bool engine_init( + uint32_t window_width, + uint32_t window_height, + const char window_name[], void (*engine_poll_events)(void), void (*engine_update_framebuffer)(void) ) { @@ -143,15 +161,28 @@ engine_init( return RCODE_FAILURE; } + game_state->framebuffer = (uint32_t *) + malloc(sizeof(uint32_t) * window_width * window_height); + if (game_state->framebuffer == NULL) { + free(internal_state); + free(game_state); + return RCODE_FAILURE; + } + internal_state->engine_poll_events = engine_poll_events; internal_state->engine_update_framebuffer = engine_update_framebuffer; - internal_state->sdl_state = engine_sdl_init(); + internal_state->sdl_state = engine_sdl_init( + window_width, + window_height, + window_name + ); if (internal_state->sdl_state == NULL) { free(internal_state); + free(game_state->framebuffer); free(game_state); return RCODE_FAILURE; }