mirror of
https://github.com/thepigeongenerator/breakout_clone.git
synced 2025-12-16 22:05:45 +01:00
add support for emscripten building
This commit is contained in:
47
src/main.c
47
src/main.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user