| 特性 | 背景音樂 (BGM) | 音效 (Effect) |
| 並發數 | 同一時間**僅一個** | 可**同時多個** |
| 典型格式 | .mp3 (推薦)、.ogg | .wav (推薦)、.ogg、.mp3 |
| 控制粒度 | 全局控制 | 每次播放返回 **音效 ID**,可單獨控制 |
| 預加載 | **必須** preloadBackgroundMusic | 可選 preloadEffect (減少首次播放延遲) |
二、 單例訪問模式
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
// 獲取單例
SimpleAudioEngine* audio = SimpleAudioEngine::getInstance(); // 3.x
// 或舊版 SimpleAudioEngine::sharedEngine()
三、 背景音樂 API 全覽
// 預加載 (必須在播放前調用,異步加載解碼)
void preloadBackgroundMusic(const char* path);
// 播放
void playBackgroundMusic(const char* path, bool loop = true); // loop=true 循環
// 暫停/恢復/停止/重播
void pauseBackgroundMusic();
void resumeBackgroundMusic();
void stopBackgroundMusic(); // 停止並重置位置
void rewindBackgroundMusic(); // 從頭播放 (不改變播放狀態)
// 狀態查詢
bool isBackgroundMusicPlaying();
// 音量控制 (0.0 ~ 1.0)
void setBackgroundMusicVolume(float volume);
float getBackgroundMusicVolume();
四、 音效 API 全覽
// 預加載/卸載
void preloadEffect(const char* path);
void unloadEffect(const char* path); // 釋放內存
// 播放:返回音效 ID (unsigned int),用於後續精確控制
unsigned int playEffect(const char* path, bool loop = false); // 默認不循環
// 單個音效控制 (需 ID)
void stopEffect(unsigned int soundId);
void pauseEffect(unsigned int soundId);
void resumeEffect(unsigned int soundId);
// 全局音效控制
void stopAllEffects();
void pauseAllEffects();
void resumeAllEffects();
// 音量 (0.0 ~ 1.0)
void setEffectsVolume(float volume);
float getEffectsVolume();
// 注意:無 isEffectPlaying(soundId) 接口,需自行擴展底層實現
五、 關鍵最佳實踐與避坑指南
- 格式選擇:BGM 用 mp3(體積小、硬解碼);音效用 wav(無壓縮、延遲極低、適合高頻觸發)。
- 生命周期管理:
- 場景切換時
stopBackgroundMusic() 或 pauseBackgroundMusic()。
- 遊戲退出/進入後台
AppDelegate::applicationDidEnterBackground 調用 pauseBackgroundMusic() / pauseAllEffects()。
- 恢復前台
applicationWillEnterForeground 調用 resumeBackgroundMusic() / resumeAllEffects()。
- 完全退出釋放引擎資源:
SimpleAudioEngine::end() (釋放單例、關閉音頻設備)。
- 常見問題排查:
- **無聲音**:檢查
preloadBackgroundMusic 是否調用;文件路徑大小寫(Android 區分大小寫);mp3 編碼是否標準(嘗試格式工廠轉碼)。
- **黑屏後音效丟失**:檢查
applicationDidEnterBackground / applicationWillEnterForeground 是否正確處理暫停恢復。
- **音效疊加失控**:播放前判斷是否已在播放,或用 ID 精確停止舊實例。
六、 代碼片段:完整播放流程
// 初始化 (AppDelegate::applicationDidFinishLaunching)
auto audio = SimpleAudioEngine::getInstance();
audio->preloadBackgroundMusic("bgm.mp3");
audio->preloadEffect("jump.wav");
audio->setBackgroundMusicVolume(0.5f);
audio->setEffectsVolume(0.8f);
// 遊戲開始
audio->playBackgroundMusic("bgm.mp3", true);
// 角色跳躍
unsigned int jumpId = audio->playEffect("jump.wav");
// 關卡結束
audio->stopEffect(jumpId);
audio->stopBackgroundMusic();
// 遊戲退出
SimpleAudioEngine::end();
- 上一篇文章: 線程安全代碼核心原則:從變量作用域到同步機制
- 下一篇文章: C++ 常量深度解析:字面值、宏、const 常變量與原生字符串
Copyright ©
程式碼之家 All Rights Reserved