add support for emscripten building

This commit is contained in:
Quinn
2024-09-04 16:01:21 +02:00
parent 3b9661cf9b
commit 0f96f3f198

View File

@@ -6,18 +6,27 @@
#include "renderer.h"
#include "level.h"
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#endif
#define UPDATES_PER_SEC 50
#define CLOCKS_PER_UPDATE (CLOCKS_PER_SEC / UPDATES_PER_SEC)
#define CLOCKS_PER_UPDATE_F (((float)CLOCKS_PER_SEC) / UPDATES_PER_SEC)
Level level = { 0 }; // stores the game's state
SDL_Window* window = NULL; // the window that is given to the OS
SDL_Renderer* renderer = NULL; // the renderer used to draw to the window
// initializes the game
static int init(SDL_Window** window, SDL_Renderer** renderer, Level* level) {
level_init(level);
return renderer_init(window, renderer);
static int init(void) {
level_init(&level);
return renderer_init(&window, &renderer);
}
// called on each game update
static bool update(Level* level, const Uint8* keys, RenderData* render_data) {
static bool update(void) {
const clock_t clock_start = clock();
//update the event keys
@@ -32,10 +41,13 @@ static bool update(Level* level, const Uint8* keys, RenderData* render_data) {
}
}
RenderData render_data = { window, renderer, &level }; //contains the data which is used to render the game
const Uint8* keys = SDL_GetKeyboardState(NULL);
// preform updates
{
level_update(level, keys); //update the level
renderer_update(render_data); //update the render
level_update(&level, keys); //update the level
renderer_update(&render_data); //update the render
}
const clock_t clock_end = clock();
@@ -54,6 +66,15 @@ static bool update(Level* level, const Uint8* keys, RenderData* render_data) {
return true;
}
#ifdef __EMSCRIPTEN__
static void update_game(void) {
// stop updating if update returns false
if (update() == false) {
emscripten_cancel_main_loop();
}
}
#endif
// cleans up resources
static void close(SDL_Window* window, SDL_Renderer* renderer) {
renderer_destroy(window, renderer);
@@ -61,13 +82,9 @@ static void close(SDL_Window* window, SDL_Renderer* renderer) {
// entry-point of the application
int main(void) {
Level level = { 0 }; //stores the game's state
SDL_Window* window = NULL; //the window that is given to the OS
SDL_Renderer* renderer = NULL; //the renderer used to draw to the window
// initialize
{
const int code = init(&window, &renderer, &level);
const int code = init();
if (code != SUCCESS)
exit(code);
}
@@ -75,9 +92,11 @@ int main(void) {
// TEMP: tell me that the program has been initialized
(void)printf("initialized!\n");
// game-loop
RenderData render_data = { window, renderer, &level }; //contains the data which is used to render the game
while (update(&level, SDL_GetKeyboardState(NULL), &render_data) && (level.stop == false));
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(update_game, 0, 1); // don't utilise setting the FPS, as we already do this
#else
while (update() && (level.stop == false));
#endif
// frees media and shuts down SDL
close(window, renderer);