From b14d2f292a357f8491146a03e695b6418bc3433b Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Thu, 2 Jan 2025 01:16:37 +0000 Subject: [PATCH] Create basic engine --- engine/CMakeLists.txt | 4 +-- engine/engine.c | 66 +++++++++++++++++++++++++++++++++++ engine/foo.c | 11 ------ engine/include/engine_hooks.h | 34 ++++++++++++++++++ engine/include/foo.h | 11 ------ 5 files changed, 101 insertions(+), 25 deletions(-) create mode 100644 engine/engine.c delete mode 100644 engine/foo.c create mode 100644 engine/include/engine_hooks.h delete mode 100644 engine/include/foo.h diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index fdfb906..dc63058 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -1,5 +1,3 @@ -add_library(engine - foo.c -) +add_library(engine engine.c) set_default_target_options(engine) target_include_directories(engine PUBLIC include) diff --git a/engine/engine.c b/engine/engine.c new file mode 100644 index 0000000..b9c7395 --- /dev/null +++ b/engine/engine.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) Camden Dixie O'Brien + * SPDX-License-Identifier: AGPL-3.0-only + */ + +#include "engine_hooks.h" + +#include +#include +#include +#include + +#define FRAMERATE 60 +#define INTERVAL (1000 / FRAMERATE) + +int main(int argc, char *argv[]) +{ + int err = SDL_Init(SDL_INIT_VIDEO); + assert(0 == err); + + SDL_Window *window = SDL_CreateWindow( + game_conf.win.title, SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, game_conf.win.w, game_conf.win.h, 0); + assert(NULL != window); + + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0); + assert(NULL != renderer); + + void *gamemem = calloc(1, game_conf.memsize); + game_init(argc, argv, gamemem, renderer); + + uint64_t prevt = SDL_GetTicks64(); + while (1) { + uint64_t t = SDL_GetTicks64(); + uint64_t dt = t - prevt; + + if (dt >= INTERVAL) { + // Handle all events currently in queue + SDL_Event evt; + while (SDL_PollEvent(&evt)) { + if (game_evthandle(gamemem, &evt) != GAMESTATUS_OK) + goto quit; + } + + // Update game state + if (game_update(gamemem, dt) != GAMESTATUS_OK) + goto quit; + + // Render frame + SDL_RenderClear(renderer); + game_render(gamemem, renderer, t); + SDL_RenderPresent(renderer); + + // Set previous frame draw time + prevt = t; + } + + SDL_Delay(2); + } + +quit: + game_teardown(gamemem); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); +} diff --git a/engine/foo.c b/engine/foo.c deleted file mode 100644 index d8aa547..0000000 --- a/engine/foo.c +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) Camden Dixie O'Brien - * SPDX-License-Identifier: AGPL-3.0-only - */ - -#include "foo.h" - -int foo(void) -{ - return 42; -} diff --git a/engine/include/engine_hooks.h b/engine/include/engine_hooks.h new file mode 100644 index 0000000..3442809 --- /dev/null +++ b/engine/include/engine_hooks.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) Camden Dixie O'Brien + * SPDX-License-Identifier: AGPL-3.0-only + */ + +#ifndef ENGINE_HOOKS_H +#define ENGINE_HOOKS_H + +#include + +typedef struct { + struct { + const char *title; + unsigned w, h; + } win; + size_t memsize; +} engineconf_t; + +typedef enum { + GAMESTATUS_OK, + GAMESTATUS_QUIT, +} gamestatus_t; + +extern const engineconf_t game_conf; + +void game_init(int argc, char *argv[], void *mem, SDL_Renderer *renderer); +void game_teardown(void *mem); + +gamestatus_t game_evthandle(void *mem, const SDL_Event *evt); +gamestatus_t game_update(void *mem, unsigned dt); + +void game_render(const void *mem, SDL_Renderer *renderer, long unsigned t); + +#endif diff --git a/engine/include/foo.h b/engine/include/foo.h deleted file mode 100644 index 271ad16..0000000 --- a/engine/include/foo.h +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) Camden Dixie O'Brien - * SPDX-License-Identifier: AGPL-3.0-only - */ - -#ifndef FOO_H -#define FOO_H - -int foo(void); - -#endif