module; #include #include #include export module game.game; import core.engine; import core.renderer; import game.sprite; import wrappers.sdl; import wrappers.sdl_image; export namespace game { class Game { // Whether this class is currently instantiated (to prevent multiple instances) static bool instantiated_; // Reference to the engine core::Engine& engine_; // Sprite for testing std::unique_ptr sprite_{nullptr}; // Private constructor explicit Game(core::Engine& engine) : engine_(engine) { // TODO: Texture should be a reference/pointer to an object managed by a ResourceManager or similar. auto texture = sdl_image::LoadTexture( engine_.get_renderer().get_sdl_renderer(), "assets/neocat.png" ); sprite_ = std::make_unique(std::move(texture), 100, 100); } public: Game() = delete; // No copy or move operations because we have a reference to the engine Game(const Game&) = delete; Game& operator=(const Game&) = delete; Game(Game&&) = delete; Game& operator=(Game&&) = delete; ~Game() { instantiated_ = false; } static std::unique_ptr create(core::Engine& engine) { // Prevent the class from being instantiated multiple times assert(!instantiated_); return std::unique_ptr{ new Game(engine) }; } // Handles an SDL event. Returns true if the event has been handled. bool handle_event(const sdl::Event* event) const { if (event->type == SDL_EVENT_MOUSE_MOTION) { sprite_->move( event->motion.x - 50, event->motion.y - 50 ); return true; } return false; } void update() { } void render() const { const auto& renderer = engine_.get_renderer(); renderer.start_frame(); sprite_->draw(renderer); renderer.finish_frame(); } void shutdown() { } }; bool Game::instantiated_ = false; }