// utils/AudioManager.js - 音频管理器(微信小程序原生) class AudioManager { constructor() { this.bgmContext = null; this.sfxContexts = new Map(); this.voiceContext = null; this.isMuted = false; this.currentBGM = null; } /** * 初始化音频上下文 */ init() { // BGM 音频上下文 this.bgmContext = wx.createInnerAudioContext(); this.bgmContext.loop = true; this.bgmContext.autoplay = false; // 语音音频上下文 this.voiceContext = wx.createInnerAudioContext(); this.voiceContext.loop = false; this.voiceContext.autoplay = false; console.log('[AudioManager] 初始化完成'); } /** * 播放背景音乐 * @param {string} src - 音频文件路径 */ playBGM(src) { if (this.isMuted) return; if (this.currentBGM === src && !this.bgmContext.paused) { return; // 已经在播放相同的BGM } this.stopBGM(); this.bgmContext.src = src; this.bgmContext.play(); this.currentBGM = src; console.log('[AudioManager] 播放BGM:', src); } /** * 停止背景音乐 */ stopBGM() { if (this.bgmContext) { this.bgmContext.stop(); this.currentBGM = null; } } /** * 播放音效 * @param {string} type - 音效类型 */ playSFX(type) { if (this.isMuted) return; const sfxMap = { 'drop': '/audio/sfx_drop.mp3', 'merge': '/audio/sfx_merge.mp3', 'combo2': '/audio/sfx_combo2.mp3', 'combo3': '/audio/sfx_combo3.mp3', 'combo4': '/audio/sfx_combo4.mp3', 'combo5': '/audio/sfx_combo5.mp3', 'golden': '/audio/sfx_golden.mp3', 'clear': '/audio/sfx_clear.mp3', 'gameover': '/audio/sfx_gameover.mp3', 'revive': '/audio/sfx_revive.mp3' }; const src = sfxMap[type]; if (!src) { console.warn('[AudioManager] 未知音效类型:', type); return; } // 复用或创建音效上下文 let context = this.sfxContexts.get(type); if (!context) { context = wx.createInnerAudioContext(); context.loop = false; context.autoplay = false; this.sfxContexts.set(type, context); } context.src = src; context.play(); console.log('[AudioManager] 播放音效:', type); } /** * 播放语音 * @param {string} src - 语音文件路径 */ playVoice(src) { if (this.isMuted) return; this.stopVoice(); this.voiceContext.src = src; this.voiceContext.play(); console.log('[AudioManager] 播放语音:', src); } /** * 停止语音 */ stopVoice() { if (this.voiceContext) { this.voiceContext.stop(); } } /** * 静音/取消静音 */ setMute(muted) { this.isMuted = muted; if (muted) { this.stopBGM(); this.stopVoice(); // 停止所有音效 for (const context of this.sfxContexts.values()) { context.stop(); } } else { // 恢复BGM if (this.currentBGM) { this.bgmContext.play(); } } console.log('[AudioManager] 静音:', muted); } /** * 销毁所有音频资源 */ destroy() { if (this.bgmContext) { this.bgmContext.destroy(); } if (this.voiceContext) { this.voiceContext.destroy(); } for (const context of this.sfxContexts.values()) { context.destroy(); } this.sfxContexts.clear(); console.log('[AudioManager] 资源已销毁'); } } // 单例导出 const audioManager = new AudioManager(); module.exports = audioManager;