#pragma once #include // 前向声明, 减少头文件的依赖,增加编译速度 struct SDL_Window; struct SDL_Renderer; namespace engine::resource { class ResourceManager; } namespace engine::render { class Renderer; class Camera; } namespace engine::input { class InputManager; } namespace engine::core { // 命名空间的最佳实践:与文件路径一致 class Time; class Config; /** * @brief 主游戏应用程序类,初始化SDL,管理游戏循环。 */ class GameApp final { // final 表示该类不能被继承 private: SDL_Window* window_ = nullptr; SDL_Renderer* sdl_renderer_ = nullptr; bool is_running_ = false; // 引擎组件 std::unique_ptr time_; std::unique_ptr resource_manager_; std::unique_ptr renderer_; std::unique_ptr camera_; std::unique_ptr config_; std::unique_ptr input_manager_; public: GameApp(); ~GameApp(); /** * @brief 运行游戏应用程序,其中会调用init(),然后进入主循环,离开循环后自动调用close()。 */ void run(); // 禁止拷贝和移动 GameApp(const GameApp&) = delete; GameApp& operator=(const GameApp&) = delete; GameApp(GameApp&&) = delete; GameApp& operator=(GameApp&&) = delete; private: [[nodiscard]] bool init(); // nodiscard 表示该函数返回值不应该被忽略 void handleEvents(); void update(float delta_time); void render(); void close(); // 各模块的初始化/创建函数,在init()中调用 [[nodiscard]] bool initConfig(); [[nodiscard]] bool initSDL(); [[nodiscard]] bool initTime(); [[nodiscard]] bool initResourceManager(); [[nodiscard]] bool initRenderer(); [[nodiscard]] bool initCamera(); [[nodiscard]] bool initInputManager(); // 测试用函数 void testResourceManager(); void testRenderer(); void testCamera(); void testInputManager(); void testGameObject(); }; } // namespace engine::core