RetroArch 在线模拟器基本制作

核心下载地址:

  • https://binbashbanana.github.io/
  • https://buildbot.libretro.com/nightly/emscripten/

声明变量

var Module = new class{
    noInitialRun = true;//布尔值 true 不主动运行Module.callMain
    arguments = ["-v", "--menu"];//-v代表输出日志  --menu打开RetroArch系统,如果是路径则直接打开游戏rom,第三个值决定canvas,默认值#canvas
    preRun = [];
    postRun = [];
    totalDependencies = 0;
    canvas = document.querySelector('#canvas'); //设置canvas 兼容处理
    wasmBinary = Uint8Array; //设置wasm的数据值,如果不设置,js载入后会自动下载xxx.wasm,例如把核心打包下载节省带宽时就需要了
    print(text){} //控制台输出
    printErr(text){} //日志输出 注意这个函数this不一定是Module
    onRuntimeInitialized(){}//wasm加载完毕时运行
}

简单例子

/js/mgba_libretro.js
/js/mgba_libretro.wasm
/1.gba
/index.html

按键处理

可以创建事件触发

document.dispatchEvent(new KeyboardEvent('keydown',{code:'KeyX'}));
document.dispatchEvent(new KeyboardEvent('keyup',{code:'KeyX'}));

数据本地化

由于无法确定是否有 IDBFS 因此最好自己参照写一个自定义的硬盘挂载

/*
    MYDFS.FS = FS;
    FS.createPath('/', "/home/web_user/retroarch/userdata/", !0, !0);//创建一个目录
    FS.mount(MYDFS, {}, "/home/web_user/retroarch/userdata/"); //挂载一个MYDFS硬盘
    await (new Promise(ok => FS.syncfs(!0, e => ok(e))));//确保已经同步完毕
 */
//在callMain之前挂载

常见BUG处理

  • 声音,由于手机策略上问题,声音初始化必须有交互事件