#include #include #include "entities/world.hpp" #include "game.hpp" #include "states/game_state.hpp" #include "states/istate.hpp" #include "states/menu_state.hpp" #include "systems/input_system.hpp" #include "systems/physics_system.hpp" #include "utils/config.hpp" namespace Nimbin { Game::~Game() = default; bool Game::init() { std::error_code ec; std::filesystem::create_directories("/tmp/game_mod_include", ec); std::filesystem::copy_file ("src/systems/game_mod_abi.h", "/tmp/game_mod_include/game_mod_abi.h", std::filesystem::copy_options::overwrite_existing, ec); if (ec) SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Could not stage game_mod_abi.h: %s", ec.message().c_str()); _gl_renderer = cpputils::make_unique(); _gl_renderer->pre_Config(); _window = SDL_CreateWindow("game", 640, 480, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL); if (!_window) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_CreateWindow failed: %s", SDL_GetError()); return false; } if (!_gl_renderer->init(_window)) return false; SDL_SetWindowRelativeMouseMode(_window, true); SDL_StartTextInput (_window); change_State(cpputils::make_unique()); return true; } void Game::change_State(cpputils::unique_ptr next) { if (_state) _state->on_Exit(*this); _state = std::move(next); if (_state) _state->on_Enter(*this); } void Game::handle_Event(const SDL_Event& event) { if (_state) _state->handle_Event(*this, event); } void Game::update(double dt_ns) { if (_state) _state->update(dt_ns * 1e-9, _gl_renderer.get()); } void Game::render() { if (_state) _state->render(*_window, *_gl_renderer); } void Game::shutdown() { SDL_Log("Power off!"); } } // namespace Nimbin