From 43997cc8f4d3e8f5f812ea9629beef3fbf704a90 Mon Sep 17 00:00:00 2001 From: Ziyu Date: Sat, 21 Jun 2025 10:52:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=A8=A1=E5=9D=97=E9=97=B4?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/config.json | 2 +- src/engine/core/game_app.cpp | 18 ++++++++++++++---- src/engine/core/game_app.h | 11 +++++++++++ src/game/scene/title_scene.cpp | 4 ---- src/main.cpp | 10 ++++++++++ 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/assets/config.json b/assets/config.json index c9c6697..aad0e94 100644 --- a/assets/config.json +++ b/assets/config.json @@ -12,7 +12,7 @@ "target_fps": 60 }, "audio": { - "music_volume": 0.5, + "music_volume": 0.2, "sound_volume": 0.5 }, "input_mappings": { diff --git a/src/engine/core/game_app.cpp b/src/engine/core/game_app.cpp index 7b2553f..97a95dd 100644 --- a/src/engine/core/game_app.cpp +++ b/src/engine/core/game_app.cpp @@ -11,7 +11,6 @@ #include "../input/input_manager.h" #include "../physics/physics_engine.h" #include "../scene/scene_manager.h" -#include "../../game/scene/title_scene.h" #include #include @@ -47,8 +46,18 @@ void GameApp::run() { close(); } +void GameApp::registerSceneSetup(std::function func) +{ + scene_setup_func_ = std::move(func); + spdlog::trace("已注册场景设置函数。"); +} + bool GameApp::init() { spdlog::trace("初始化 GameApp ..."); + if (!scene_setup_func_) { + spdlog::error("未注册场景设置函数,无法初始化 GameApp。"); + return false; + } if (!initConfig()) return false; if (!initSDL()) return false; if (!initTime()) return false; @@ -64,9 +73,8 @@ bool GameApp::init() { if (!initContext()) return false; if (!initSceneManager()) return false; - // 创建第一个场景并压入栈 - auto scene = std::make_unique(*context_, *scene_manager_); - scene_manager_->requestPushScene(std::move(scene)); + // 调用场景设置函数 (创建第一个场景并压入栈) + scene_setup_func_(*scene_manager_); is_running_ = true; spdlog::trace("GameApp 初始化成功。"); @@ -191,6 +199,8 @@ bool GameApp::initAudioPlayer() { try { audio_player_ = std::make_unique(resource_manager_.get()); + audio_player_->setMusicVolume(config_->music_volume_); // 设置背景音乐音量 + audio_player_->setSoundVolume(config_->sound_volume_); // 设置音效音量 } catch (const std::exception& e) { spdlog::error("初始化音频播放器失败: {}", e.what()); return false; diff --git a/src/engine/core/game_app.h b/src/engine/core/game_app.h index 11516e5..74493e3 100644 --- a/src/engine/core/game_app.h +++ b/src/engine/core/game_app.h @@ -1,5 +1,6 @@ #pragma once #include +#include // 前向声明, 减少头文件的依赖,增加编译速度 struct SDL_Window; @@ -46,6 +47,9 @@ private: SDL_Renderer* sdl_renderer_ = nullptr; bool is_running_ = false; + /// @brief 游戏场景设置函数,用于在运行游戏前设置初始场景 (GameApp不再决定初始场景是什么) + std::function scene_setup_func_; + // 引擎组件 std::unique_ptr time_; std::unique_ptr resource_manager_; @@ -69,6 +73,13 @@ public: */ void run(); + /** + * @brief 注册用于设置初始游戏场景的函数。 + * 这个函数将在 SceneManager 初始化后被调用。 + * @param func 一个接收 SceneManager 引用的函数对象。 + */ + void registerSceneSetup(std::function func); + // 禁止拷贝和移动 GameApp(const GameApp&) = delete; GameApp& operator=(const GameApp&) = delete; diff --git a/src/game/scene/title_scene.cpp b/src/game/scene/title_scene.cpp index a52db53..6efe359 100644 --- a/src/game/scene/title_scene.cpp +++ b/src/game/scene/title_scene.cpp @@ -69,10 +69,6 @@ void TitleScene::createUI() { return; } - // 设置音量 - context_.getAudioPlayer().setMusicVolume(0.2f); // 设置背景音乐音量为20% - context_.getAudioPlayer().setSoundVolume(0.5f); // 设置音效音量为50% - // 设置背景音乐 context_.getAudioPlayer().playMusic("assets/audio/platformer_level03_loop.ogg"); diff --git a/src/main.cpp b/src/main.cpp index dacba1b..94cad99 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,20 @@ #include "engine/core/game_app.h" +#include "engine/scene/scene_manager.h" +#include "game/scene/title_scene.h" #include +void setupInitialScene(engine::scene::SceneManager& scene_manager) { + // GameApp在调用run方法之前,先创建并设置初始场景 + auto title_scene = std::make_unique(scene_manager.getContext(), scene_manager); + scene_manager.requestPushScene(std::move(title_scene)); +} + + int main(int /* argc */, char* /* argv */[]) { spdlog::set_level(spdlog::level::off); engine::core::GameApp app; + app.registerSceneSetup(setupInitialScene); app.run(); return 0; } \ No newline at end of file