Abstract the global renderer, physics, camera and gamemap objects behind a pointer, so you can swap in and out different ones as needed
This commit is contained in:
78
src/game.c
78
src/game.c
@@ -19,17 +19,22 @@
|
||||
#include <akgl/SDL_GameControllerDB.h>
|
||||
|
||||
SDL_Window *window = NULL;
|
||||
akgl_RenderBackend renderer;
|
||||
akgl_PhysicsBackend physics;
|
||||
akgl_Frame ball;
|
||||
akgl_Frame paddle1;
|
||||
akgl_Frame paddle2;
|
||||
akgl_Frame table;
|
||||
akgl_Tilemap gamemap;
|
||||
|
||||
// Currently active objects
|
||||
akgl_RenderBackend *renderer;
|
||||
akgl_PhysicsBackend *physics;
|
||||
SDL_FRect *camera;
|
||||
akgl_Tilemap *gamemap;
|
||||
|
||||
// Default objects
|
||||
akgl_RenderBackend _akgl_renderer;
|
||||
akgl_PhysicsBackend _akgl_physics;
|
||||
SDL_FRect _akgl_camera;
|
||||
akgl_Tilemap _akgl_gamemap;
|
||||
|
||||
MIX_Audio *bgm = NULL;
|
||||
MIX_Mixer *akgl_mixer = NULL;
|
||||
MIX_Track *akgl_tracks[AKGL_GAME_AUDIO_MAX_TRACKS];
|
||||
SDL_FRect camera;
|
||||
akgl_Game game;
|
||||
|
||||
void akgl_game_lowfps(void)
|
||||
@@ -45,31 +50,26 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init()
|
||||
|
||||
int i = 0;
|
||||
PREPARE_ERROR(e);
|
||||
ATTEMPT {
|
||||
strncpy((char *)&game.libversion, AKGL_VERSION, 32);
|
||||
game.gameStartTime = SDL_GetTicksNS();
|
||||
game.lastIterTime = game.gameStartTime;
|
||||
game.lastFPSTime = game.gameStartTime;
|
||||
game.lowfpsfunc = &akgl_game_lowfps;
|
||||
game.statelock = SDL_CreateMutex();
|
||||
FAIL_ZERO_RETURN(e, game.statelock, AKGL_ERR_SDL, "%s", SDL_GetError());
|
||||
CATCH(e, akgl_game_state_lock());
|
||||
FAIL_ZERO_BREAK(e, strlen((char *)&game.name), AKERR_NULLPOINTER, "Must provide game name");
|
||||
FAIL_ZERO_BREAK(e, strlen((char *)&game.version), AKERR_NULLPOINTER, "Must provide game version");
|
||||
FAIL_ZERO_BREAK(e, strlen((char *)&game.uri), AKERR_NULLPOINTER, "Must provide game uri");
|
||||
CATCH(e, akgl_heap_init());
|
||||
CATCH(e, akgl_registry_init_actor());
|
||||
CATCH(e, akgl_registry_init_sprite());
|
||||
CATCH(e, akgl_registry_init_spritesheet());
|
||||
CATCH(e, akgl_registry_init_character());
|
||||
CATCH(e, akgl_registry_init_font());
|
||||
CATCH(e, akgl_registry_init_music());
|
||||
CATCH(e, akgl_registry_init_properties());
|
||||
CATCH(e, akgl_registry_init_actor_state_strings());
|
||||
} CLEANUP {
|
||||
//IGNORE(akgl_game_state_unlock());
|
||||
} PROCESS(e) {
|
||||
} FINISH(e, true)
|
||||
strncpy((char *)&game.libversion, AKGL_VERSION, 32);
|
||||
game.gameStartTime = SDL_GetTicksNS();
|
||||
game.lastIterTime = game.gameStartTime;
|
||||
game.lastFPSTime = game.gameStartTime;
|
||||
game.lowfpsfunc = &akgl_game_lowfps;
|
||||
game.statelock = SDL_CreateMutex();
|
||||
FAIL_ZERO_RETURN(e, game.statelock, AKGL_ERR_SDL, "%s", SDL_GetError());
|
||||
PASS(e, akgl_game_state_lock());
|
||||
FAIL_ZERO_RETURN(e, strlen((char *)&game.name), AKERR_NULLPOINTER, "Must provide game name");
|
||||
FAIL_ZERO_RETURN(e, strlen((char *)&game.version), AKERR_NULLPOINTER, "Must provide game version");
|
||||
FAIL_ZERO_RETURN(e, strlen((char *)&game.uri), AKERR_NULLPOINTER, "Must provide game uri");
|
||||
PASS(e, akgl_heap_init());
|
||||
PASS(e, akgl_registry_init_actor());
|
||||
PASS(e, akgl_registry_init_sprite());
|
||||
PASS(e, akgl_registry_init_spritesheet());
|
||||
PASS(e, akgl_registry_init_character());
|
||||
PASS(e, akgl_registry_init_font());
|
||||
PASS(e, akgl_registry_init_music());
|
||||
PASS(e, akgl_registry_init_properties());
|
||||
PASS(e, akgl_registry_init_actor_state_strings());
|
||||
|
||||
SDL_SetAppMetadata(game.name, game.version, game.uri);
|
||||
|
||||
@@ -113,6 +113,12 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init()
|
||||
AKGL_ERR_SDL,
|
||||
"Couldn't initialize front engine: %s",
|
||||
SDL_GetError());
|
||||
|
||||
camera = &_akgl_camera;
|
||||
renderer = &_akgl_renderer;
|
||||
physics = &_akgl_physics;
|
||||
gamemap = &_akgl_gamemap;
|
||||
|
||||
PASS(e, akgl_game_state_unlock());
|
||||
SUCCEED_RETURN(e);
|
||||
}
|
||||
@@ -432,15 +438,15 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_update(akgl_Iterator *opflags)
|
||||
continue;
|
||||
}
|
||||
if ( AKGL_BITMASK_HAS(opflags->flags, AKGL_ITERATOR_OP_TILEMAPSCALE) ) {
|
||||
PASS(e, akgl_tilemap_scale_actor(&gamemap, actor));
|
||||
PASS(e, akgl_tilemap_scale_actor(gamemap, actor));
|
||||
} else {
|
||||
actor->scale = 1.0;
|
||||
}
|
||||
PASS(e, actor->updatefunc(actor));
|
||||
}
|
||||
}
|
||||
PASS(e, physics.simulate(&physics, NULL));
|
||||
PASS(e, renderer.draw_world(&renderer, NULL));
|
||||
PASS(e, physics->simulate(physics, NULL));
|
||||
PASS(e, renderer->draw_world(renderer, NULL));
|
||||
PASS(e, akgl_game_state_unlock());
|
||||
SUCCEED_RETURN(e);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user