html-tower/static/input.js

57 lines
1.5 KiB
JavaScript

console.log("loading input system");
const inputStates = Object.freeze({
DEFAULT: 0,
});
const inputSystem = (engine) => {
engine("registerEvent", "moveDown");
engine("registerEvent", "moveUp");
engine("registerEvent", "moveLeft");
engine("registerEvent", "moveRight");
let state = inputStates.DEFAULT;
let currentPresses = new Set();
const stateEvents = {};
stateEvents[inputStates.DEFAULT] = {
ArrowDown: () => engine("queueEvent", "moveDown"),
ArrowUp: () => engine("queueEvent", "moveUp"),
ArrowLeft: () => engine("queueEvent", "moveLeft",),
ArrowRight: () => engine("queueEvent", "moveRight")
};
const process = () => {
currentPresses.forEach(press => {
// nop function for unmapped keypresses
(stateEvents[state][press] || (() => null))();
});
};
document.addEventListener('keydown', (event) => {
event.preventDefault();
currentPresses.add(event.key);
event.stopPropagation();
process();
});
document.addEventListener('keyup', (event) => {
event.preventDefault();
currentPresses.delete(event.key);
event.stopPropagation();
process();
});
return (message, ...messageArgs) => {
switch (message) {
case "inputState": {
return state;
}
case "setInputState": {
let stateKey = messageArgs[0];
state = inputStates[stateKey];
break;
}
};
};
};