ChickenMonster2 / audio_controller.js
Lashtw's picture
Upload 11 files
a129185 verified
// 音效控制器 - 完整版本
const audioController = {
bgm: null,
attackSounds: {},
resultSounds: {},
isBGMPlaying: false,
isInitialized: false,
// 初始化音效控制器
init() {
if (this.isInitialized) return;
console.log('音效控制器初始化中...');
// 初始化背景音樂
try {
this.bgm = new Audio('BGM.mp3');
this.bgm.loop = true;
this.bgm.volume = 0.3;
this.bgm.preload = 'auto';
console.log('背景音樂已載入: BGM.mp3');
} catch (error) {
console.log('背景音樂載入失敗:', error);
}
// 初始化攻擊音效
try {
this.attackSounds = {
strong: new Audio('atk1.mp3'), // 強攻擊音效
medium: new Audio('atk2.mp3'), // 普通攻擊音效
weak: new Audio('atk3.mp3') // 弱攻擊音效
};
// 設置攻擊音效音量
Object.values(this.attackSounds).forEach(sound => {
sound.volume = 0.6;
sound.preload = 'auto';
});
console.log('攻擊音效已載入: atk1.mp3, atk2.mp3, atk3.mp3');
} catch (error) {
console.log('攻擊音效載入失敗:', error);
}
// 初始化結果音效
try {
this.resultSounds = {
win: new Audio('win.mp3'),
lose: new Audio('Lose.mp3')
};
// 設置結果音效音量
Object.values(this.resultSounds).forEach(sound => {
sound.volume = 0.6;
sound.preload = 'auto';
});
console.log('勝利/失敗音效已載入');
} catch (error) {
console.log('結果音效載入失敗:', error);
}
this.isInitialized = true;
console.log('音效控制器初始化完成');
},
// 播放背景音樂
playBGM() {
if (!this.bgm) {
console.log('背景音樂未載入');
return;
}
try {
const playPromise = this.bgm.play();
if (playPromise !== undefined) {
playPromise.then(() => {
this.isBGMPlaying = true;
console.log('背景音樂開始播放: BGM.mp3');
}).catch(error => {
console.log('背景音樂播放失敗:', error);
// 瀏覽器可能阻止自動播放,這是正常的
});
}
} catch (error) {
console.log('背景音樂播放錯誤:', error);
}
},
// 暫停背景音樂
pauseBGM() {
if (this.bgm && this.isBGMPlaying) {
this.bgm.pause();
this.isBGMPlaying = false;
console.log('背景音樂已暫停');
}
},
// 切換背景音樂
toggleBGM() {
if (!this.bgm) {
console.log('背景音樂功能已載入,但可能因瀏覽器限制無法自動播放');
return;
}
if (this.isBGMPlaying) {
this.pauseBGM();
} else {
this.playBGM();
}
},
// 播放攻擊音效
playAttackSound(type = 'medium') {
if (!this.attackSounds[type]) {
console.log(`攻擊音效 ${type} 未載入`);
return;
}
try {
// 重置音效到開始位置
this.attackSounds[type].currentTime = 0;
const playPromise = this.attackSounds[type].play();
if (playPromise !== undefined) {
playPromise.then(() => {
console.log(`播放 ${type} 攻擊音效`);
}).catch(error => {
console.log(`${type} 攻擊音效播放失敗:`, error);
});
}
} catch (error) {
console.log(`${type} 攻擊音效播放錯誤:`, error);
}
},
// 播放結果音效
playResultSound(type = 'win') {
if (!this.resultSounds[type]) {
console.log(`結果音效 ${type} 未載入`);
return;
}
try {
// 重置音效到開始位置
this.resultSounds[type].currentTime = 0;
const playPromise = this.resultSounds[type].play();
if (playPromise !== undefined) {
playPromise.then(() => {
console.log(`播放 ${type} 結果音效`);
}).catch(error => {
console.log(`${type} 結果音效播放失敗:`, error);
});
}
} catch (error) {
console.log(`${type} 結果音效播放錯誤:`, error);
}
},
// 停止所有音效
stopAll() {
// 停止背景音樂
if (this.bgm) {
this.bgm.pause();
this.bgm.currentTime = 0;
this.isBGMPlaying = false;
}
// 停止攻擊音效
Object.values(this.attackSounds).forEach(sound => {
if (sound) {
sound.pause();
sound.currentTime = 0;
}
});
// 停止結果音效
Object.values(this.resultSounds).forEach(sound => {
if (sound) {
sound.pause();
sound.currentTime = 0;
}
});
console.log('所有音效已停止');
},
// 設置音量
setVolume(bgmVolume = 0.3, effectVolume = 0.5) {
if (this.bgm) {
this.bgm.volume = Math.max(0, Math.min(1, bgmVolume));
}
Object.values(this.attackSounds).forEach(sound => {
if (sound) {
sound.volume = Math.max(0, Math.min(1, effectVolume));
}
});
Object.values(this.resultSounds).forEach(sound => {
if (sound) {
sound.volume = Math.max(0, Math.min(1, effectVolume));
}
});
console.log(`音量設置 - 背景音樂: ${bgmVolume}, 音效: ${effectVolume}`);
},
// 檢查音效支援
checkAudioSupport() {
const audio = new Audio();
const support = {
mp3: audio.canPlayType('audio/mpeg') !== '',
ogg: audio.canPlayType('audio/ogg') !== '',
wav: audio.canPlayType('audio/wav') !== '',
m4a: audio.canPlayType('audio/mp4') !== ''
};
console.log('音效格式支援:', support);
return support;
}
};