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处理
- 声音,由于手机策略上问题,声音初始化必须有交互事件