/* eslint-env browser */ import { DefaultLogger as TLogger } from 'itee-core' import { Keys } from '../cores/TConstants' /** * @class * @classdesc TKeyboardController allow single source of thruth for keyboard state checking (based on Lee Stemkoski work). * See TKeyboardController.k object data below for names of keys whose state can be polled * * @author [Tristan Valcke]{@link https://github.com/Itee} * @license [BSD-3-Clause]{@link https://opensource.org/licenses/BSD-3-Clause} * @example {@lang javascript} * // (1) create a global variable: * var keyboard = new TKeyboardController(); * * // (2) during main loop: * keyboard.update(); * * // (3) check state of keys: * keyboard.down("A") -- true for one update cycle after key is pressed * keyboard.pressed("A") -- true as long as key is being pressed * keyboard.up("A") -- true for one update cycle after key is released */ class TKeyboardController { /** * * @param keyCode * @return {string} */ static keyName ( keyCode ) { return ( TKeyboardController.k[ keyCode ] !== null ) ? TKeyboardController.k[ keyCode ] : String.fromCharCode( keyCode ) } /** * * @param event */ static onKeyUp ( event ) { var key = TKeyboardController.keyName( event.keyCode ) if ( TKeyboardController.status[ key ] ) { TKeyboardController.status[ key ].pressed = false } } /** * * @param event */ static onKeyDown ( event ) { var key = TKeyboardController.keyName( event.keyCode ) if ( !TKeyboardController.status[ key ] ) { TKeyboardController.status[ key ] = { down: false, pressed: false, up: false, updatedPreviously: false } } } /** * * @param parameters */ // eslint-disable-next-line no-unused-vars constructor ( parameters = {} ) { // const _parameters = { // ...{}, // ...parameters // } // bind keyEvents document.addEventListener( 'keydown', TKeyboardController.onKeyDown, false ) document.addEventListener( 'keyup', TKeyboardController.onKeyUp, false ) } /** * */ update () { for ( var key in TKeyboardController.status ) { // insure that every keypress has "down" status exactly once if ( !TKeyboardController.status[ key ].updatedPreviously ) { TKeyboardController.status[ key ].down = true TKeyboardController.status[ key ].pressed = true TKeyboardController.status[ key ].updatedPreviously = true } else { // updated previously TKeyboardController.status[ key ].down = false } // key has been flagged as "up" since last update if ( TKeyboardController.status[ key ].up ) { delete TKeyboardController.status[ key ] continue // move on to next key } if ( !TKeyboardController.status[ key ].pressed ) // key released { TKeyboardController.status[ key ].up = true } } } /** * * @param keyName * @return {*} */ down ( keyName ) { return ( TKeyboardController.status[ keyName ] && TKeyboardController.status[ keyName ].down ) } /** * * @param keyName * @return {*|pressed|boolean} */ pressed ( keyName ) { return ( TKeyboardController.status[ keyName ] && TKeyboardController.status[ keyName ].pressed ) } /** * * @param keyName * @return {*} */ up ( keyName ) { return ( TKeyboardController.status[ keyName ] && TKeyboardController.status[ keyName ].up ) } /** * */ debug () { var list = 'Keys active: ' for ( var arg in TKeyboardController.status ) { list += ' ' + arg } TLogger.log( list ) } } /** * * @type {Keys} */ TKeyboardController.k = Keys /** * * @type {{}} */ TKeyboardController.status = {} export { TKeyboardController }