lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
47 lines • 1.66 kB
JavaScript
import { createEffect } from "@lincode/reactivity";
import { onKeyClear } from "../events/onKeyClear";
import { emitKeyDown } from "../events/onKeyDown";
import { emitKeyPress } from "../events/onKeyPress";
import { emitKeyUp } from "../events/onKeyUp";
import { getWorldPlayComputed } from "../states/useWorldPlayComputed";
import { keyPressSet } from "../collections/keyPressSet";
import { keyPressEmitSystem } from "../systems/keyPressEmitSystem";
const processKey = (str) => {
str = str.length === 1 ? str.toLocaleLowerCase() : str;
if (str === " ")
str = "Space";
return str;
};
createEffect(() => {
if (!getWorldPlayComputed())
return;
keyPressEmitSystem.add(keyPressSet);
const handle = onKeyClear(() => {
if (!keyPressSet.size)
return;
const pressed = [...keyPressSet];
keyPressSet.clear();
for (const key of pressed)
emitKeyUp(key);
});
const handleKeyDown = (e) => {
const key = processKey(e.key);
keyPressSet.add(key);
emitKeyDown(key);
};
const handleKeyUp = (e) => {
const key = processKey(e.key);
keyPressSet.delete(key);
emitKeyUp(key);
!keyPressSet.size && emitKeyPress();
};
document.addEventListener("keydown", handleKeyDown);
document.addEventListener("keyup", handleKeyUp);
return () => {
keyPressEmitSystem.delete(keyPressSet);
handle.cancel();
document.removeEventListener("keydown", handleKeyDown);
document.removeEventListener("keyup", handleKeyUp);
};
}, [getWorldPlayComputed]);
//# sourceMappingURL=keyboard.js.map