gamepad input

This commit is contained in:
Ethan O'Brien 2023-06-29 20:02:55 -05:00
parent 0afa3dcdcc
commit 83fdc73aa2

View file

@ -491,19 +491,12 @@ class EmulatorJS {
this.gamepad.on('disconnected', (e) => { this.gamepad.on('disconnected', (e) => {
setTimeout(this.updateGamepadLabels.bind(this), 10); setTimeout(this.updateGamepadLabels.bind(this), 10);
}) })
this.gamepad.on('axischanged', function(e) { this.gamepad.on('axischanged', this.gamepadEvent.bind(this));
console.log('axischanged', e); this.gamepad.on('buttondown', this.gamepadEvent.bind(this));
}) this.gamepad.on('buttonup', this.gamepadEvent.bind(this));
this.gamepad.on('buttondown', function(e) {
console.log('buttondown', e);
})
this.gamepad.on('buttonup', function(e) {
console.log('buttonup', e);
})
} }
updateGamepadLabels() { updateGamepadLabels() {
for (let i=0; i<this.gamepadLabels.length; i++) { for (let i=0; i<this.gamepadLabels.length; i++) {
console.log(this.gamepad.gamepads[i]);
if (this.gamepad.gamepads[i]) { if (this.gamepad.gamepads[i]) {
this.gamepadLabels[i].innerText = this.gamepad.gamepads[i].id; this.gamepadLabels[i].innerText = this.gamepad.gamepads[i].id;
} else { } else {
@ -820,16 +813,17 @@ class EmulatorJS {
} }
createControlSettingMenu() { createControlSettingMenu() {
let buttonListeners = []; let buttonListeners = [];
this.checkGamepadInputs = () => buttonListeners.forEach(elem => elem());
this.gamepadLabels = []; this.gamepadLabels = [];
this.controls = this.defaultControllers; this.controls = JSON.parse(JSON.stringify(this.defaultControllers));
const body = this.createPopup("Control Settings", { const body = this.createPopup("Control Settings", {
"Reset": () => { "Reset": () => {
this.controls = JSON.parse(JSON.stringify(this.defaultControllers)); this.controls = JSON.parse(JSON.stringify(this.defaultControllers));
buttonListeners.forEach(elem => elem()); this.checkGamepadInputs();
}, },
"Clear": () => { "Clear": () => {
this.controls = {0:{},1:{},2:{},3:{}}; this.controls = {0:{},1:{},2:{},3:{}};
buttonListeners.forEach(elem => elem()); this.checkGamepadInputs();
}, },
"Close": () => { "Close": () => {
this.controlMenu.style.display = "none"; this.controlMenu.style.display = "none";
@ -976,10 +970,10 @@ class EmulatorJS {
buttonListeners.push(() => { buttonListeners.push(() => {
textBox2.value = ""; textBox2.value = "";
textBox1.value = ""; textBox1.value = "";
if (this.controls[i][k] && this.controls[i][k].value) { if (this.controls[i][k] && this.controls[i][k].value !== undefined) {
textBox2.value = this.controls[i][k].value; textBox2.value = this.controls[i][k].value;
} }
if (this.controls[i][k] && this.controls[i][k].value2) { if (this.controls[i][k] && this.controls[i][k].value2 !== undefined) {
textBox1.value = this.controls[i][k].value2; textBox1.value = this.controls[i][k].value2;
} }
}) })
@ -988,7 +982,7 @@ class EmulatorJS {
textBox2.value = this.controls[i][k].value; textBox2.value = this.controls[i][k].value;
} }
if (this.controls[i][k] && this.controls[i][k].value2) { if (this.controls[i][k] && this.controls[i][k].value2) {
textBox1.value = this.controls[i][k].value2; textBox1.value = "button " + this.controls[i][k].value2;
} }
textBoxes.appendChild(textBox1Parent); textBoxes.appendChild(textBox1Parent);
@ -1021,15 +1015,6 @@ class EmulatorJS {
this.controlPopup.innerText = "[ " + buttons[k] + " ]\n"; this.controlPopup.innerText = "[ " + buttons[k] + " ]\n";
this.controlPopup.setAttribute("button-num", k); this.controlPopup.setAttribute("button-num", k);
this.controlPopup.setAttribute("player-num", i); this.controlPopup.setAttribute("player-num", i);
this.updateTextBoxes = () => {
if (this.controls[i][k] && this.controls[i][k].value) {
textBox2.value = this.controls[i][k].value;
}
if (this.controls[i][k] && this.controls[i][k].value2) {
textBox1.value = this.controls[i][k].value2;
}
delete this.updateTextBoxes;
}
}) })
} }
controls.appendChild(player); controls.appendChild(player);
@ -1138,7 +1123,7 @@ class EmulatorJS {
} }
this.controls[player][num].value = e.key.toLowerCase(); this.controls[player][num].value = e.key.toLowerCase();
this.controlPopup.parentElement.setAttribute("hidden", ""); this.controlPopup.parentElement.setAttribute("hidden", "");
this.updateTextBoxes(); this.checkGamepadInputs();
return; return;
} }
const special = [16, 17, 18, 19, 20, 21, 22, 23]; const special = [16, 17, 18, 19, 20, 21, 22, 23];
@ -1150,6 +1135,77 @@ class EmulatorJS {
} }
} }
} }
gamepadEvent(e) {
if (!this.started) return;
if (this.settingsMenu.style.display !== "none" || this.cheatMenu.style.display !== "none") return;
const value = function(value) {
if (value > 0.5 || value < -0.5) {
return (value > 0) ? 1 : -1;
} else {
return 0;
}
}(e.value || 0);
if (this.controlPopup.parentElement.getAttribute("hidden") === null) {
if ('buttonup' === e.type || (e.type === "axischanged" && value === 0)) return;
const num = this.controlPopup.getAttribute("button-num");
const player = this.controlPopup.getAttribute("player-num");
if (!this.controls[player][num]) {
this.controls[player][num] = {};
}
this.controls[player][num].value2 = (e.type === "axischanged" ? e.axis+":"+value : e.index);
this.controlPopup.parentElement.setAttribute("hidden", "");
this.checkGamepadInputs();
return;
}
const special = [16, 17, 18, 19, 20, 21, 22, 23];
for (let i=0; i<4; i++) {
for (let j=0; j<26; j++) {
if (['buttonup', 'buttondown'].includes(e.type) || (this.controls[i][j] && this.controls[i][j].value2 === e.index)) {
this.gameManager.simulateInput(i, j, (e.type === 'buttondown' ? 0 : (special.includes(j) ? 0x7fff : 1)));
} else if (e.type === "axischanged") {
if (this.controls[i][j] && this.controls[i][j].value2 && this.controls[i][j].value2.split(":")[0] === e.axis) {
if (special.includes(j)) {
if (e.axis === 'LEFT_STICK_X') {
if (e.value > 0) {
this.gameManager.simulateInput(e.gamepadIndex, 16, 0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 17, 0);
} else {
this.gameManager.simulateInput(e.gamepadIndex, 17, -0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 16, 0);
}
} else if (e.axis === 'LEFT_STICK_Y') {
if (e.value > 0) {
this.gameManager.simulateInput(e.gamepadIndex, 18, 0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 19, 0);
} else {
this.gameManager.simulateInput(e.gamepadIndex, 19, -0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 18, 0);
}
} else if (e.axis === 'RIGHT_STICK_X') {
if (e.value > 0) {
this.gameManager.simulateInput(e.gamepadIndex, 20, 0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 21, 0);
} else {
this.gameManager.simulateInput(e.gamepadIndex, 21, -0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 20, 0);
}
} else if (e.axis === 'RIGHT_STICK_Y') {
if (e.value > 0) {
this.gameManager.simulateInput(e.gamepadIndex, 22, 0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 23, 0);
} else {
this.gameManager.simulateInput(e.gamepadIndex, 23, 0x7fff * e.value);
this.gameManager.simulateInput(e.gamepadIndex, 22, 0);
}
}
} else if (this.controls[i][j].value2 === e.axis+":"+value || value === 0) {
this.gameManager.simulateInput(i, j, ((value === 0) ? 0 : 1));
}
}
}
}
}
}
setVirtualGamepad() { setVirtualGamepad() {
this.virtualGamepad = this.createElement("div"); this.virtualGamepad = this.createElement("div");
this.virtualGamepad.style.display = "none"; this.virtualGamepad.style.display = "none";