import InputHandler from "./input_handler.js"; /** * @module KeyboardHandler * @fileoverview Contains KeyboardHandler class. */ /** * Keyboard input handler. * @class * @extends InputHandler */ class KeyboardHandler extends InputHandler { /** * Create a new keyboard input handler. * @param {EventHandler|EventHandlerLayer} parentHandler Parent event handler or layer * @param {function} condition Function for checking whether events should run * @constructor */ constructor(parentHandler, condition = () => { return true; }) { super(parentHandler, "keyboard/", condition); this._downHandler = this._handleDown.bind(this); this._upHandler = this._handleUp.bind(this); this._blurHandler = this._handleBlur.bind(this); this._init(); } destructor() { super.destructor(); document.removeEventListener("keydown", this._downHandler); document.removeEventListener("keyup", this._upHandler); document.removeEventListener("blur", this._blurHandler); } // Initialization /** * Setup up keyboard input listening. * @private */ _init() { document.addEventListener("keydown", this._downHandler); document.addEventListener("keyup", this._upHandler); window.addEventListener("blur", this._blurHandler); } // Handling key presses /** * Handle the event of pressing down a key. * @param {KeyboardEvent} event Event from document * @private */ _handleDown(event) { if (!this.gameFocused()) return; const key = event.key.toLowerCase(); if (!this._currentlyDown.has(key)) this._doPress(key); this._currentlyDown.add(key); this._doDown(key); } /** * Handle the event of releasing a key. * @param {KeyboardEvent} event Event from document * @private */ _handleUp(event) { const key = event.key.toLowerCase(); if (!this.gameFocused()) { this._currentlyDown.delete(key); return; } this._currentlyDown.delete(key); this._doRelease(key); } /** * Handle the event of the page losing focus. * @private */ _handleBlur() { this._currentlyDown.clear(); } } export default KeyboardHandler;