#include "GameEngine.h" #include "AssetManager.h" #include "ObjectStore.h" #include "Renderer.h" #include "SDL.h" #include "SDL_error.h" #include "SDL_events.h" #include "SDL_image.h" #include "SDL_pixels.h" #include "SDL_render.h" #include "Window.h" #include "constants.h" #include "engine_build_config.h" #include "reusable_ids.h" #include #include #ifdef DEBUG_ENGINE #include #endif /* DEBUG_ENGINE */ INTERNAL struct game { bool running; float delta; Window window; SDL_Event event; ObjectStore *object_store; AssetManager *asset_manager; } Game; bool init_game(const char *game_name, int window_width, int window_height, SDL_Color window_background_color, bool full_screen) { bool initialisation_complete = true; if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { #ifdef DEBUG_ENGINE printf("Failed to initialise SDL. Error: %s\n", SDL_GetError()); #endif /* DEBUG_ENGINE */ return false; } if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) { initialisation_complete = false; } if (!init_window(&(Game.window), game_name, window_width, window_height, window_background_color, full_screen)) { #ifdef DEBUG_ENGINE printf("Failed to initialise window\n"); #endif /* DEBUG_ENGINE */ initialisation_complete = false; } Game.object_store = create_object_store(); if (!(Game.object_store)) { initialisation_complete = false; } Game.asset_manager = create_asset_manager(); if (!(Game.asset_manager)) { initialisation_complete = false; } if (!initialisation_complete) { close_game(); return false; } Game.running = true; // Game.delta = 0.0f; Game.delta = 1.0f / 60.0f; #ifdef DEBUG_ENGINE printf("Game initialised successfully\n"); #endif /* DEBUG_ENGINE */ return true; } bool game_running() { return Game.running; } ObjectID add_object(void *object, EventHandlerPtr event_handler, UpdateFuncPtr update_func, RenderFuncPtr render_func) { if (!(Game.running) || !(Game.object_store)) { return -1; } return add_object_to_store(Game.object_store, object, event_handler, update_func, render_func); } void remove_object(ObjectID id) { if (!(Game.running) || !(Game.object_store)) { return; } remove_object_from_store(Game.object_store, id); } AssetID load_asset(const char *path, AssetType type) { return type == ASSET_TYPE_IMAGE ? load_asset_to_manager(Game.asset_manager, path, type, Game.window.renderer) : load_asset_to_manager(Game.asset_manager, path, type, NULL); } void render_texture_asset(AssetID id, float x, float y, float w, float h) { if (id < 0) { return; } SDL_Texture *texture = get_texture(Game.asset_manager, id); render_texture(Game.window.renderer, texture, x, y, w, h); } void close_asset(AssetID id) { remove_asset_from_manager(Game.asset_manager, id); } void handle_events() { if (!(Game.running)) { return; } while (SDL_PollEvent(&(Game.event))) { switch (Game.event.type) { case SDL_QUIT: Game.running = false; break; } if (!Game.object_store) { break; } handle_all_objects_events(Game.object_store, &(Game.event)); } } void update() { if (!(Game.running) || !(Game.object_store)) { return; } update_all_objects(Game.object_store, Game.delta); } void render() { if (!(Game.running)) { return; } clear_window(&(Game.window)); if (Game.object_store) { render_all_objects(Game.object_store); } swap_render_buffers(&(Game.window)); } void close_game() { destroy_asset_manager(Game.asset_manager); Game.asset_manager = NULL; destroy_object_store(Game.object_store); Game.object_store = NULL; destroy_window(&(Game.window)); Game.delta = 0.0f; Game.running = false; IMG_Quit(); SDL_Quit(); #ifdef DEBUG_ENGINE printf("Game closed successfully\n"); #endif /* DEBUG_ENGINE */ }