You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用标准gamePad代码路径正确仍无法找到声音文件问题求助

问题:使用标准gamePad代码时路径配置正确仍无法加载声音文件

已做过充分调研,Stack Overflow上找到的公开方案经实际验证均无法解决问题,具体现象如下:

  • BBEdit的「Markup」菜单预览功能可正常找到并加载声音文件,部署到商业服务器后运行异常
  • 键盘按键触发音频播放的逻辑,在本地Mac环境、服务器环境均能正常运行
  • 故障复现条件:所有源码上传至服务器后,通过外部服务器运行gamePad代码加载声音文件时,音频无法正常播放

现有文件层级结构

games folder
   Game_1 folder
      game1.html
      Game_Support folder
         audio folder
         js folder

现有相关代码

HTML部分

<body onload="doBodyOnLoad()">

JS部分

function doBodyOnLoad() {
    $(document).ready(function() {
        // ... //
    });   // $(document).ready
}   // doBodyOnload


function setupKeypresses() {
    $(document).keydown(function(evt) {
        let code = evt.keyCode || evt.which;
        // 示例逻辑
        if (code === "R")
        {
            movePaddleRight();  // 该方法会调用下方的ouch()
        }
    });
}   // setupKeypresses


function PlaySound(id, src) {
    let theSound = new Audio();
    theSound.src = src;
    theSound.play();
}   // PlaySound


function ouch() {
    updateScore(--thisScore);
    // 测试过绝对路径也无法生效
    // var theSnd = "http://lovesongforever.com/games/Game_1/Game_1_Support/audio/explosion.mp3";
    var theSnd = "Game_1_Support/audio/explosion.mp3";
    PlaySound("audioPlaceHolder", theSnd);
            
    // 淡出逻辑:整板淡出正常,单独球拍淡出暂未实现
    doFade("#gameBoard");
}   // ouch

修复方案

按优先级逐个排查即可:

  1. 先核对路径匹配问题
    你给出的文件结构中,game1.html同级的资源文件夹名为Game_Support,但代码里写的路径是Game_1_Support,文件夹名不一致是最常见的404原因。本地BBEdit预览有路径容错机制,可能读取了本地残留的同名旧文件夹所以表现正常,但商业服务器对文件名、大小写的匹配是严格校验的,不会做自动容错。
    另外如果上述JS代码存放在js子文件夹中,相对路径需要从js文件的位置开始寻址,正确路径应该是../../Game_Support/audio/explosion.mp3,而不是从html文件位置开始写路径。
  2. 定位具体报错原因
    给音频播放逻辑加错误捕获,打开浏览器控制台看具体报错信息:
    function PlaySound(id, src) {
        let theSound = new Audio();
        theSound.src = src;
        theSound.play().catch(err => console.log('播放失败:', err));
    }
    
    同时打开浏览器开发者工具的「网络」面板,筛选音频请求看状态码:
    • 状态码404:回到第一步核对路径、文件名、文件夹大小写
    • 状态码403:是服务器限制了音频文件访问,需要给服务器配置.mp3对应的MIME类型audio/mpeg,给资源目录开放访问权限
    • 控制台提示无用户交互无法自动播放:是浏览器自动播放策略拦截,gamePad输入默认不会被识别为用户主动交互行为,可以在页面首次加载时提示用户按一次键盘任意键完成交互授权,后续gamePad触发的播放就不会被拦截
  3. 额外逻辑问题修正
    现有代码中if (code === "R")的判断永远不会生效,keyCode返回的是数字值,R键对应的编码是82,需要写成if (code === 82)才能正确触发逻辑。

内容的提问来源于stack exchange,提问作者user19147296

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:39:13