133 lines
2.1 KiB
JavaScript
133 lines
2.1 KiB
JavaScript
/**
|
|
* 音频管理器
|
|
*/
|
|
export default class AudioManager {
|
|
constructor() {
|
|
this.bgm = null;
|
|
this.sfx = {};
|
|
this.isMuted = false;
|
|
this.bgmVolume = 0.5;
|
|
this.sfxVolume = 0.8;
|
|
}
|
|
|
|
/**
|
|
* 播放背景音乐
|
|
*/
|
|
playBGM(src) {
|
|
if (this.isMuted || !src) return;
|
|
|
|
// 停止当前BGM
|
|
this.stopBGM();
|
|
|
|
// 创建新的音频实例
|
|
this.bgm = wx.createInnerAudioContext();
|
|
this.bgm.src = src;
|
|
this.bgm.loop = true;
|
|
this.bgm.volume = this.bgmVolume;
|
|
this.bgm.play();
|
|
}
|
|
|
|
/**
|
|
* 停止背景音乐
|
|
*/
|
|
stopBGM() {
|
|
if (this.bgm) {
|
|
this.bgm.stop();
|
|
this.bgm.destroy();
|
|
this.bgm = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 暂停背景音乐
|
|
*/
|
|
pauseBGM() {
|
|
if (this.bgm) {
|
|
this.bgm.pause();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 恢复背景音乐
|
|
*/
|
|
resumeBGM() {
|
|
if (this.bgm && !this.isMuted) {
|
|
this.bgm.play();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 播放音效
|
|
*/
|
|
playSFX(name, src) {
|
|
if (this.isMuted || !src) return;
|
|
|
|
// 复用或创建音效实例
|
|
if (!this.sfx[name]) {
|
|
this.sfx[name] = wx.createInnerAudioContext();
|
|
this.sfx[name].src = src;
|
|
}
|
|
|
|
this.sfx[name].volume = this.sfxVolume;
|
|
this.sfx[name].seek(0);
|
|
this.sfx[name].play();
|
|
}
|
|
|
|
/**
|
|
* 播放点击音效
|
|
*/
|
|
playClick() {
|
|
// 可以配置点击音效
|
|
// this.playSFX('click', 'audio/click.mp3');
|
|
}
|
|
|
|
/**
|
|
* 设置静音
|
|
*/
|
|
setMute(muted) {
|
|
this.isMuted = muted;
|
|
if (muted) {
|
|
this.pauseBGM();
|
|
} else {
|
|
this.resumeBGM();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 切换静音状态
|
|
*/
|
|
toggleMute() {
|
|
this.setMute(!this.isMuted);
|
|
return this.isMuted;
|
|
}
|
|
|
|
/**
|
|
* 设置BGM音量
|
|
*/
|
|
setBGMVolume(volume) {
|
|
this.bgmVolume = Math.max(0, Math.min(1, volume));
|
|
if (this.bgm) {
|
|
this.bgm.volume = this.bgmVolume;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 设置音效音量
|
|
*/
|
|
setSFXVolume(volume) {
|
|
this.sfxVolume = Math.max(0, Math.min(1, volume));
|
|
}
|
|
|
|
/**
|
|
* 销毁所有音频
|
|
*/
|
|
destroy() {
|
|
this.stopBGM();
|
|
Object.values(this.sfx).forEach(audio => {
|
|
audio.stop();
|
|
audio.destroy();
|
|
});
|
|
this.sfx = {};
|
|
}
|
|
}
|