UNPKG

replay-viewer

Version:

Rocket League replay viewer React component and tooling

125 lines 5.15 kB
import { FREE_CAMERA } from "../constants/gameObjectNames"; import { addCameraChangeListener, removeCameraChangeListener, } from "../eventbus/events/cameraChange"; import { dispatchKeyControlEvent, } from "../eventbus/events/keyControl"; var KeyManager = /** @class */ (function () { function KeyManager() { var _this = this; this.onCameraChange = function (_a) { var camera = _a.camera; var isFreeCam = camera.name === FREE_CAMERA; if (isFreeCam !== _this.listening) { _this.toggleKeyListener(); } }; this.onKeyUpEvent = function (_a) { var keyCode = _a.keyCode; _this.keysPressed = _this.keysPressed.filter(function (code) { return keyCode !== code; }); }; this.onKeyDownEvent = function (_a) { var keyCode = _a.keyCode; // Kill listeners on escape key if (keyCode === 27 && _this.listening) { _this.toggleKeyListener(); } _this.lastKeyPress = performance.now(); if (!_this.keysPressed.includes(keyCode)) { _this.keysPressed.push(keyCode); } }; this.resetKeyCodes = function () { _this.keysPressed = []; }; this.sendDispatch = function () { // The last key press was detected 2000ms ago, shut off dispatch // TODO: This will shut off dispatches if you press a new key and then release the new key // without keyup on the first. Should fix for edge case. if (performance.now() - _this.lastKeyPress > 2000) { _this.keysPressed = []; return; } if (_this.keysPressed.length) { var directions_1 = []; var speed_1 = true; _this.keysPressed.forEach(function (keyCode) { switch (keyCode) { case 70: // F speed_1 = false; break; case 37: // Left arrow case 65: // A directions_1.push("left"); break; case 38: // Up arrow case 87: // W directions_1.push("forward"); break; case 39: // Right arrow case 68: // D directions_1.push("right"); break; case 40: // Down arrow case 83: // S directions_1.push("backward"); break; case 32: // Space directions_1.push("up"); break; case 16: // Shift // speed = true directions_1.push("down"); break; } }); dispatchKeyControlEvent({ directions: directions_1, speed: speed_1, }); } }; this.listening = false; this.keysPressed = []; this.lastKeyPress = 0; addCameraChangeListener(this.onCameraChange); } KeyManager.prototype.toggleKeyListener = function () { this.listening = !this.listening; if (this.listening) { document.addEventListener("keyup", this.onKeyUpEvent); document.addEventListener("keydown", this.onKeyDownEvent); // If we don't remove these keys on blur/focus, they get "stuck" when refocusing the document document.addEventListener("focus", this.resetKeyCodes); document.addEventListener("blur", this.resetKeyCodes); this.interval = setInterval(this.sendDispatch, 1000 / 30); } else { document.removeEventListener("keyup", this.onKeyUpEvent); document.removeEventListener("keydown", this.onKeyDownEvent); document.removeEventListener("focus", this.resetKeyCodes); document.removeEventListener("blur", this.resetKeyCodes); if (this.interval) { clearInterval(this.interval); } } return this.listening; }; KeyManager.getInstance = function () { if (!KeyManager.instance) { throw new Error("KeyManager not initialized with call to `init`"); } return KeyManager.instance; }; KeyManager.init = function () { KeyManager.instance = new KeyManager(); return KeyManager.instance; }; KeyManager.destruct = function () { var instance = KeyManager.instance; if (instance) { removeCameraChangeListener(instance.onCameraChange); KeyManager.instance = undefined; } }; return KeyManager; }()); export default KeyManager; //# sourceMappingURL=KeyManager.js.map