var Class = require('../../utils/Class'); var Event = require('./events'); var Key = require('./keys/Key'); var KeyCodes = require('./keys/KeyCodes'); var KeyCombo = require('./combo/KeyCombo'); var ProcessKeyCombo = require('./combo/ProcessKeyCombo'); var ProcessKeyDown = require('./keys/ProcessKeyDown'); var ProcessKeyUp = require('./keys/ProcessKeyUp'); var KeyboardManager = new Class({ initialize: function KeyboardManager(inputManager){ this.manager = inputManager; this.enabled = false ; this.target; this.keys = [] ; this.combos = [] ; this.captures = [] ; this.queue = [] ; this.handler; } , boot: function (){ var config = this.manager.config; this.enabled = config.inputKeyboard; _AN_Write_target('target', this, false , config.inputKeyboardEventTarget); if (this.enabled) { this.startListeners(); } } , startListeners: function (){ var queue = this.queue; var captures = this.captures; var handler = function (event){ if (event.preventDefaulted) { return ; } queue.push(event); if (captures[event.keyCode]) { event.preventDefault(); } } ; this.handler = handler; _AN_Read_target('target', this).addEventListener('keydown', handler, false ); _AN_Read_target('target', this).addEventListener('keyup', handler, false ); } , stopListeners: function (){ _AN_Read_target('target', this).removeEventListener('keydown', this.handler); _AN_Read_target('target', this).removeEventListener('keyup', this.handler); } , createCursorKeys: function (){ return this.addKeys({ up: KeyCodes.UP, down: KeyCodes.DOWN, left: KeyCodes.LEFT, right: KeyCodes.RIGHT} ); } , addKeys: function (keys){ var output = { } ; for (var key in keys){ output[key] = this.addKey(keys[key]); } return output; } , addKey: function (keyCode){ var keys = this.keys; if (!keys[keyCode]) { keys[keyCode] = new Key(keyCode); this.captures[keyCode] = true ; } return keys[keyCode]; } , removeKey: function (keyCode){ if (this.keys[keyCode]) { this.keys[keyCode] = undefined; this.captures[keyCode] = false ; } } , addKeyCapture: function (keyCodes){ if (!Array.isArray(keyCodes)) { keyCodes = [keyCodes] ; } for (var i = 0; i < (_AN_Read_length('length', keyCodes)); i++ ){ this.captures[keyCodes[i]] = true ; } } , removeKeyCapture: function (keyCodes){ if (!Array.isArray(keyCodes)) { keyCodes = [keyCodes] ; } for (var i = 0; i < (_AN_Read_length('length', keyCodes)); i++ ){ this.captures[keyCodes[i]] = false ; } } , createCombo: function (keys, config){ return new KeyCombo(this, keys, config); } , update: function (){ var len = _AN_Read_length('length', this.queue); if (!this.enabled || len === 0) { return ; } var queue = this.queue.splice(0, len); var keys = this.keys; var singleKey; for (var i = 0; i < len; i++ ){ var event = queue[i]; if (event.type === 'keydown') { this.manager.events.dispatch(new Event.KEY_DOWN_EVENT(event)); singleKey = Event._DOWN[event.keyCode]; if (singleKey) { this.manager.events.dispatch(new singleKey(event)); } if (keys[event.keyCode]) { ProcessKeyDown(keys[event.keyCode], event); } } else { this.manager.events.dispatch(new Event.KEY_UP_EVENT(event)); singleKey = Event._UP[event.keyCode]; if (singleKey) { this.manager.events.dispatch(new singleKey(event)); } if (keys[event.keyCode]) { ProcessKeyUp(keys[event.keyCode], event); } } } } } ); module.exports = KeyboardManager;