replay-viewer
Version:
Rocket League replay viewer React component and tooling
125 lines • 5.15 kB
JavaScript
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