2025-07-14 16:37:56 +08:00
|
|
|
const audioFils = {
|
|
|
|
|
第一轮:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fl26qrspvy79.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
第二轮:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fehshrpe5ook.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
第三轮:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fgbz3iimk7yy.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
第四轮:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fjwf50tlxxbi.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
第五轮:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fg63lqrslhm7.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
决金箭轮:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fhjycwubbwil.mp3",
|
2025-08-28 19:34:24 +08:00
|
|
|
请蓝方射箭:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fr0zpluiabph.mp3",
|
2025-08-28 19:34:24 +08:00
|
|
|
请红方射箭:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fu169yerpwey.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
中场休息:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblu6fug8faqrbtwd.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
比赛结束:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblsdl717ilr0b3o0.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
比赛开始:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbblsdl7qlkqgvthfr.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
请开始射击:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbljrfx5guqt5oulk.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
未上靶:
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkxm60bul0khcoqq.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"1环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufj59qmdo96ha.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"2环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufogy49ousbv4.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"3环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufl3hhijeasck.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"4环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklufo8vo7k6jxdz.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"5环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklkzq7lrbfpr6ij.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"6环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0fw7hbmmhxkl.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"7环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0fkirkanghmf.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"8环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0cly2noykieg.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"9环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbkll0gsuumekhpkn.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
"10环":
|
2025-08-04 18:36:44 +08:00
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-07-14/dbbklgw2dk22ek7qha.mp3",
|
2025-08-26 18:00:40 +08:00
|
|
|
射击无效:
|
|
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-08-26/dcc9qc84rir8gkj3mo.mp3",
|
2025-08-28 10:39:16 +08:00
|
|
|
距离不足5米:
|
|
|
|
|
"https://static.shelingxingqiu.com/attachment/2025-08-27/dcd59px1cavp1hogxi.mp3",
|
2025-07-14 16:37:56 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class AudioManager {
|
|
|
|
|
constructor() {
|
|
|
|
|
this.audioMap = new Map();
|
2025-08-27 18:23:59 +08:00
|
|
|
this.currentPlayingKey = null; // 记录当前播放的音频key
|
2025-08-29 10:41:25 +08:00
|
|
|
this.retryCount = new Map(); // 记录每个音频的重试次数
|
|
|
|
|
this.maxRetries = 3; // 最大重试次数
|
|
|
|
|
this.retryDelay = 1000; // 重试延迟时间(毫秒)
|
2025-08-27 18:23:59 +08:00
|
|
|
|
2025-08-29 10:41:25 +08:00
|
|
|
this.initAudios();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化音频
|
|
|
|
|
initAudios() {
|
2025-07-14 16:37:56 +08:00
|
|
|
Object.keys(audioFils).forEach((key) => {
|
2025-08-29 10:41:25 +08:00
|
|
|
this.createAudio(key);
|
2025-07-14 16:37:56 +08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-29 10:41:25 +08:00
|
|
|
// 创建单个音频实例
|
|
|
|
|
createAudio(key) {
|
|
|
|
|
const audio = uni.createInnerAudioContext();
|
|
|
|
|
audio.src = audioFils[key];
|
|
|
|
|
audio.autoplay = false;
|
|
|
|
|
|
|
|
|
|
// 监听加载状态
|
|
|
|
|
audio.onCanplay(() => {
|
|
|
|
|
// console.log(`音频 ${key} 已加载完成`);
|
|
|
|
|
// 加载成功后重置重试计数
|
|
|
|
|
this.retryCount.set(key, 0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
audio.onError((res) => {
|
|
|
|
|
console.log(`音频 ${key} 加载失败:`, res.errMsg);
|
|
|
|
|
this.handleAudioError(key);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 监听播放结束事件
|
|
|
|
|
audio.onEnded(() => {
|
|
|
|
|
if (this.currentPlayingKey === key) {
|
|
|
|
|
this.currentPlayingKey = null;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 监听播放停止事件
|
|
|
|
|
audio.onStop(() => {
|
|
|
|
|
if (this.currentPlayingKey === key) {
|
|
|
|
|
this.currentPlayingKey = null;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.audioMap.set(key, audio);
|
|
|
|
|
// 初始化重试计数
|
|
|
|
|
if (!this.retryCount.has(key)) {
|
|
|
|
|
this.retryCount.set(key, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 处理音频加载错误
|
|
|
|
|
handleAudioError(key) {
|
|
|
|
|
const currentRetries = this.retryCount.get(key) || 0;
|
|
|
|
|
|
|
|
|
|
if (currentRetries < this.maxRetries) {
|
|
|
|
|
// 增加重试计数
|
|
|
|
|
this.retryCount.set(key, currentRetries + 1);
|
|
|
|
|
|
|
|
|
|
console.log(`音频 ${key} 开始第 ${currentRetries + 1} 次重试...`);
|
|
|
|
|
|
|
|
|
|
// 延迟重试
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
this.retryLoadAudio(key);
|
|
|
|
|
}, this.retryDelay);
|
|
|
|
|
} else {
|
|
|
|
|
console.error(`音频 ${key} 重试 ${this.maxRetries} 次后仍然失败,停止重试`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 重新加载音频
|
|
|
|
|
retryLoadAudio(key) {
|
|
|
|
|
// 销毁旧的音频实例
|
|
|
|
|
const oldAudio = this.audioMap.get(key);
|
|
|
|
|
if (oldAudio) {
|
|
|
|
|
oldAudio.destroy();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建新的音频实例
|
|
|
|
|
this.createAudio(key);
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-14 16:37:56 +08:00
|
|
|
// 播放指定音频
|
|
|
|
|
play(key) {
|
2025-08-27 18:23:59 +08:00
|
|
|
// 如果有正在播放的音频,先停止
|
|
|
|
|
if (this.currentPlayingKey) {
|
|
|
|
|
this.stop(this.currentPlayingKey);
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-14 16:37:56 +08:00
|
|
|
const audio = this.audioMap.get(key);
|
2025-08-27 18:23:59 +08:00
|
|
|
if (audio) {
|
2025-08-29 10:41:25 +08:00
|
|
|
// 检查音频是否加载失败过多次
|
|
|
|
|
const retries = this.retryCount.get(key) || 0;
|
|
|
|
|
if (retries >= this.maxRetries) {
|
|
|
|
|
console.warn(`音频 ${key} 加载失败次数过多,尝试重新初始化`);
|
|
|
|
|
this.retryLoadAudio(key);
|
|
|
|
|
// 延迟播放,等待重新加载
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
const newAudio = this.audioMap.get(key);
|
|
|
|
|
if (newAudio) {
|
|
|
|
|
newAudio.play();
|
|
|
|
|
this.currentPlayingKey = key;
|
|
|
|
|
}
|
|
|
|
|
}, 500);
|
|
|
|
|
} else {
|
|
|
|
|
audio.play();
|
|
|
|
|
this.currentPlayingKey = key;
|
|
|
|
|
}
|
2025-08-27 18:23:59 +08:00
|
|
|
}
|
2025-07-14 16:37:56 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 停止指定音频
|
|
|
|
|
stop(key) {
|
|
|
|
|
const audio = this.audioMap.get(key);
|
2025-08-27 18:23:59 +08:00
|
|
|
if (audio) {
|
|
|
|
|
audio.stop();
|
|
|
|
|
if (this.currentPlayingKey === key) {
|
|
|
|
|
this.currentPlayingKey = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-14 16:37:56 +08:00
|
|
|
}
|
|
|
|
|
|
2025-08-29 10:41:25 +08:00
|
|
|
// 停止所有音频
|
|
|
|
|
stopAll() {
|
|
|
|
|
this.audioMap.forEach((audio, key) => {
|
|
|
|
|
audio.stop();
|
|
|
|
|
});
|
|
|
|
|
this.currentPlayingKey = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 手动重新加载指定音频
|
|
|
|
|
reloadAudio(key) {
|
|
|
|
|
if (audioFils[key]) {
|
|
|
|
|
console.log(`手动重新加载音频: ${key}`);
|
|
|
|
|
this.retryCount.set(key, 0); // 重置重试计数
|
|
|
|
|
this.retryLoadAudio(key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 重新加载所有音频
|
|
|
|
|
reloadAllAudios() {
|
|
|
|
|
console.log('重新加载所有音频...');
|
|
|
|
|
this.audioMap.forEach((audio, key) => {
|
|
|
|
|
audio.destroy();
|
|
|
|
|
});
|
|
|
|
|
this.audioMap.clear();
|
|
|
|
|
this.retryCount.clear();
|
|
|
|
|
this.currentPlayingKey = null;
|
|
|
|
|
this.initAudios();
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-14 16:37:56 +08:00
|
|
|
// 销毁所有音频实例
|
|
|
|
|
destroyAll() {
|
|
|
|
|
this.audioMap.forEach((audio) => {
|
|
|
|
|
audio.destroy();
|
|
|
|
|
});
|
|
|
|
|
this.audioMap.clear();
|
2025-08-29 10:41:25 +08:00
|
|
|
this.retryCount.clear();
|
2025-08-27 18:23:59 +08:00
|
|
|
this.currentPlayingKey = null;
|
2025-07-14 16:37:56 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 导出单例
|
|
|
|
|
export default new AudioManager();
|