Flask后端Flappy Bird游戏:音频资源预加载阻塞启动问题
问题排查与修复方案
1. 先修正loadAssets的音频加载逻辑
图片用onload没问题,但音频不能用同样的事件——得监听canplaythrough(确保音频能完整播放)或者loadeddata(加载了足够播放的初始数据)。如果你的函数里还是给音频绑onload,那它根本不会触发完成事件,导致加载计数器永远到不了总数,游戏自然卡在加载。
给你一个修复后的函数示例:
function loadAssets(names, paths, callback) { const assets = {}; let loadedCount = 0; const totalAssets = names.length; names.forEach((name, index) => { const path = paths[index]; // 区分图片和音频资源 if (path.match(/\.(png|jpg|jpeg|gif|webp)$/i)) { const img = new Image(); img.src = path; img.onload = finishLoad; img.onerror = (err) => { console.error(`图片加载失败: ${name}`, err); finishLoad(); }; assets[name] = img; } else if (path.match(/\.(mp3|wav|ogg)$/i)) { const audio = new Audio(); audio.src = path; // 用canplaythrough事件监听音频加载完成 audio.addEventListener('canplaythrough', finishLoad); audio.addEventListener('error', (err) => { console.error(`音频加载失败: ${name}`, err); finishLoad(); }); // 主动触发加载 audio.load(); assets[name] = audio; } function finishLoad() { loadedCount++; if (loadedCount === totalAssets) { callback(assets); } } }); return assets; }
2. 排查音频加载的其他坑
- 格式兼容性:Chrome对OGG的支持偶尔会出问题,优先用MP3或者WAV这类通用格式,必要时给音频多提供一种格式 fallback。
- Flask静态资源路径:别光说路径正确,手动核对:音频文件是不是放在
static文件夹下?前端路径是不是用{{ url_for('static', filename='audio/xxx.mp3') }}生成的?如果是硬写的相对路径,可能在路由切换时出问题。 - 检查Network请求:打开Chrome DevTools的Network标签,筛选Media类型,看音频请求的状态:
- 404:路径绝对错了,重新找;
- 200但没内容:文件损坏了,重新替换音频文件;
- 跨域错误:安装
flask-cors,给Flask加CORS配置。
3. 加错误处理防卡死
不管是图片还是音频,都要加onerror事件——就算某个资源加载失败,也能让计数器继续走,不会卡在加载界面。上面的示例里已经加了,你可以照着改。
4. 手动测试音频加载
在Console里跑这段代码,单独测试音频能不能加载:
const testAudio = new Audio('/static/audio/你的音频文件名.mp3'); testAudio.addEventListener('canplaythrough', () => console.log('音频加载成了')); testAudio.addEventListener('error', (e) => console.log('加载炸了', e)); testAudio.load();
看控制台输出,直接定位是加载事件没触发,还是真的路径/文件有问题。
内容的提问来源于stack exchange,提问作者Rivves
相关产品推荐
相关产品推荐

