add gamepad support

This commit is contained in:
2021-12-03 00:24:26 +01:00
parent aba00b1cae
commit b73cad3092

View File

@@ -162,10 +162,37 @@ async function runModule(data) {
try { try {
let now = Date.now(); let now = Date.now();
let restart = false;
if(now >= nextFrame) { if(now >= nextFrame) {
let gamepads = navigator.getGamepads();
let gamepad = 0;
for(let i = 0; i < 4; ++i) {
let pad = gamepads[i];
if(!pad) {
continue;
}
for(let j = 0; j < 8; ++j) {
let buttonIdx = (j+12) % 16;
if(pad.buttons.length > buttonIdx && pad.buttons[buttonIdx].pressed) {
gamepad |= 1 << (i * 8 + j);
}
}
if(pad.axes.length > 1) {
for(let j = 0; j < 4; ++j) {
let v = pad.axes[1-(j>>1)];
if(((j & 1) ? v : -v) > 0.5) {
gamepad |= 1 << (i * 8 + j);
}
}
}
if(pad.buttons.length > 9 && pad.buttons[9].pressed) {
restart = true;
}
}
let u32Mem = U32(memory.buffer); let u32Mem = U32(memory.buffer);
u32Mem[16] = now - startTime; u32Mem[16] = now - startTime;
u32Mem[17] = pad; u32Mem[17] = pad | gamepad;
instance.exports.upd(); instance.exports.upd();
let palette = U32(memory.buffer.slice(0x13000, 0x13000 + 1024)); let palette = U32(memory.buffer.slice(0x13000, 0x13000 + 1024));
@@ -176,7 +203,11 @@ async function runModule(data) {
nextFrame = Math.max(nextFrame + timePerFrame, now); nextFrame = Math.max(nextFrame + timePerFrame, now);
} }
window.requestAnimationFrame(mainloop); if(restart) {
runModule(currentData);
} else {
window.requestAnimationFrame(mainloop);
}
} catch (err) { } catch (err) {
setMessage(cartridgeSize, err.toString()); setMessage(cartridgeSize, err.toString());
} }