從 MenuScene 切換到 HelloWorldScene 時,需傳遞一個整數參數(如關卡編號)。
觀察者模式,解耦發送者與接收者,跨場景、跨層級皆可用。
// Cocos2d-x C++
auto eventDispatcher = Director::getInstance()->getEventDispatcher();
// 或使用 NotificationCenter
NotificationCenter::getInstance()->postNotification("LEVEL_SELECTED", __Integer::create(3));
// 切換場景
Director::getInstance()->replaceScene(HelloWorldScene::createScene());
// 在 init 或 onEnter 註冊
NotificationCenter::getInstance()->addObserver(this,
[this](Ref* sender) {
auto num = dynamic_cast<__Integer*>(sender);
if (num) {
currentLevel = num->getValue();
initLevel(currentLevel);
}
},
"LEVEL_SELECTED", nullptr);
// 在 onExit 移除觀察者(防止洩漏)
NotificationCenter::getInstance()->removeObserver(this, "LEVEL_SELECTED");
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| NotificationCenter | 解耦、一對多、跨場景 | 隱性依賴、難追蹤 | 事件通知、解鎖成就、設定變更 |
| Singleton 模型類 | 集中管理、型別安全 | 全域狀態、測試難 | 玩家資料、遊戲設定、關卡進度 |
| Scene 建構式傳參 | 明確、編譯期檢查 | 需修改 createScene 簽名 | 關卡編號、角色選擇等核心參數 |
| UserDefault 持久化 | 跨啟動保留 | I/O 延遲、非即時 | 音量、語言、教學完成標記 |
核心遊戲參數(關卡、角色)用 **Scene 建構式傳參** 最清晰;UI 事件、成就解鎖、設定同步用 **NotificationCenter**;長期保留用 **UserDefault**。