emulator/gba3/js/keypad.js
2019-06-14 09:33:19 +08:00

170 lines
4.3 KiB
JavaScript

function GameBoyAdvanceKeypad() {
this.KEYCODE_LEFT = 37;
this.KEYCODE_UP = 38;
this.KEYCODE_RIGHT = 39;
this.KEYCODE_DOWN = 40;
this.KEYCODE_START = 13;
this.KEYCODE_SELECT = 220;
this.KEYCODE_A = 90;
this.KEYCODE_B = 88;
this.KEYCODE_L = 65;
this.KEYCODE_R = 83;
this.GAMEPAD_LEFT = 14;
this.GAMEPAD_UP = 12;
this.GAMEPAD_RIGHT = 15;
this.GAMEPAD_DOWN = 13;
this.GAMEPAD_START = 9;
this.GAMEPAD_SELECT = 8;
this.GAMEPAD_A = 1;
this.GAMEPAD_B = 0;
this.GAMEPAD_L = 4;
this.GAMEPAD_R = 5;
this.GAMEPAD_THRESHOLD = 0.2;
this.A = 0;
this.B = 1;
this.SELECT = 2;
this.START = 3;
this.RIGHT = 4;
this.LEFT = 5;
this.UP = 6;
this.DOWN = 7;
this.R = 8;
this.L = 9;
this.currentDown = 0x03FF;
this.eatInput = false;
this.gamepads = [];
};
GameBoyAdvanceKeypad.prototype.keyboardHandler = function(e) {
var toggle = 0;
switch (e.keyCode) {
case this.KEYCODE_START:
toggle = this.START;
break;
case this.KEYCODE_SELECT:
toggle = this.SELECT;
break;
case this.KEYCODE_A:
toggle = this.A;
break;
case this.KEYCODE_B:
toggle = this.B;
break;
case this.KEYCODE_L:
toggle = this.L;
break;
case this.KEYCODE_R:
toggle = this.R;
break;
case this.KEYCODE_UP:
toggle = this.UP;
break;
case this.KEYCODE_RIGHT:
toggle = this.RIGHT;
break;
case this.KEYCODE_DOWN:
toggle = this.DOWN;
break;
case this.KEYCODE_LEFT:
toggle = this.LEFT;
break;
default:
return;
}
toggle = 1 << toggle;
if (e.type == "keydown") {
this.currentDown &= ~toggle;
} else {
this.currentDown |= toggle;
}
if (this.eatInput) {
e.preventDefault();
}
};
GameBoyAdvanceKeypad.prototype.gamepadHandler = function(gamepad) {
var value = 0;
if (gamepad.buttons[this.GAMEPAD_LEFT] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.LEFT;
}
if (gamepad.buttons[this.GAMEPAD_UP] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.UP;
}
if (gamepad.buttons[this.GAMEPAD_RIGHT] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.RIGHT;
}
if (gamepad.buttons[this.GAMEPAD_DOWN] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.DOWN;
}
if (gamepad.buttons[this.GAMEPAD_START] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.START;
}
if (gamepad.buttons[this.GAMEPAD_SELECT] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.SELECT;
}
if (gamepad.buttons[this.GAMEPAD_A] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.A;
}
if (gamepad.buttons[this.GAMEPAD_B] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.B;
}
if (gamepad.buttons[this.GAMEPAD_L] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.L;
}
if (gamepad.buttons[this.GAMEPAD_R] > this.GAMEPAD_THRESHOLD) {
value |= 1 << this.R;
}
this.currentDown = ~value & 0x3FF;
};
GameBoyAdvanceKeypad.prototype.gamepadConnectHandler = function(gamepad) {
this.gamepads.push(gamepad);
};
GameBoyAdvanceKeypad.prototype.gamepadDisconnectHandler = function(gamepad) {
this.gamepads = self.gamepads.filter(function(other) { return other != gamepad });
};
GameBoyAdvanceKeypad.prototype.pollGamepads = function() {
var navigatorList = [];
if (navigator.webkitGetGamepads) {
navigatorList = navigator.webkitGetGamepads();
} else if (navigator.getGamepads) {
navigatorList = navigator.getGamepads();
}
// Let's all give a shout out to Chrome for making us get the gamepads EVERY FRAME
if (navigatorList.length) {
this.gamepads = [];
}
for (var i = 0; i < navigatorList.length; ++i) {
if (navigatorList[i]) {
this.gamepads.push(navigatorList[i]);
}
}
if (this.gamepads.length > 0) {
this.gamepadHandler(this.gamepads[0]);
}
};
GameBoyAdvanceKeypad.prototype.registerHandlers = function() {
window.addEventListener("keydown", this.keyboardHandler.bind(this), true);
window.addEventListener("keyup", this.keyboardHandler.bind(this), true);
window.addEventListener("gamepadconnected", this.gamepadConnectHandler.bind(this), true);
window.addEventListener("mozgamepadconnected", this.gamepadConnectHandler.bind(this), true);
window.addEventListener("webkitgamepadconnected", this.gamepadConnectHandler.bind(this), true);
window.addEventListener("gamepaddisconnected", this.gamepadDisconnectHandler.bind(this), true);
window.addEventListener("mozgamepaddisconnected", this.gamepadDisconnectHandler.bind(this), true);
window.addEventListener("webkitgamepaddisconnected", this.gamepadDisconnectHandler.bind(this), true);
};