var chip8; (function (chip8) { 'use strict'; /** * Creates keyboard instance which handles chip8 input. * @class chip8.Keyboard */ function Keyboard() { var reversedKey, self = this; this.keyState = new Array(16); for (var key in Keyboard.PC_KEY_MAP) { if (Keyboard.PC_KEY_MAP.hasOwnProperty(key)) { reversedKey = 'KEY_' + (Keyboard.PC_KEY_MAP[key]).toString(16).toUpperCase(); Keyboard.CHIP8_KEYS[reversedKey] = parseInt(key, 10); } } function onKeyDown(e) { var key = e.which || e.keyCode, chip8Key = Keyboard.PC_KEY_MAP[key]; if (typeof chip8Key !== 'undefined') { self.keyDown(chip8Key); } } function onKeyUp(e) { var key = e.which || e.keyCode, chip8Key = Keyboard.PC_KEY_MAP[key]; if (typeof chip8Key !== 'undefined') { self.keyUp(chip8Key); } } /** * This method is called and set to NOP after each key down. * @param {number} chip8Key - pressed key number (0x0 - 0xF) * @function onNextKeyPressed * @memberof chip8.Keyboard * @instance */ this.onNextKeyPressed = function (chip8Key) { // override in class instance void chip8Key; }; window.removeEventListener('keydown',onKeyDown); window.removeEventListener('keyup', onKeyUp); window.addEventListener('keydown', onKeyDown, false); window.addEventListener('keyup', onKeyUp, false); } /** * Checks if given key is pressed. * @param {number} key - key number (0x0 - 0xF) * @returns {boolean} true if key is pressed, false otherwise * @function isKeyPressed * @memberof chip8.Keyboard * @instance */ Keyboard.prototype.isKeyPressed = function (key) { return !!this.keyState[key]; }; /** * Simulates key down. * @param {number} chip8Key - key number (0x0 - 0xF) * @function keyDown * @memberof chip8.Keyboard * @instance */ Keyboard.prototype.keyDown = function (chip8Key) { this.keyState[chip8Key] = true; this.onNextKeyPressed(chip8Key); this.onNextKeyPressed = function () {}; }; /** * Simulates key up. * @param {number} chip8Key - key number (0x0 - 0xF) * @function keyUp * @memberof chip8.Keyboard * @instance */ Keyboard.prototype.keyUp = function (chip8Key) { this.keyState[chip8Key] = false; }; /** * Resets keyboard state. * @function reset * @memberof chip8.Keyboard * @instance */ Keyboard.prototype.reset = function () { this.keyState = new Array(16); this.onNextKeyPressed = function () {}; }; /** * Maps PC keys to chip8 keys. * @memberof chip8.Keyboard * @type {Object} * @enum */ Keyboard.PC_KEY_MAP = { 88: 0x0, 49: 0x1, 50: 0x2, 51: 0x3, 81: 0x4, 87: 0x5, 69: 0x6, 65: 0x7, 83: 0x8, 68: 0x9, 90: 0xA, 67: 0xB, 52: 0xC, 82: 0xD, 70: 0xE, 86: 0xF }; /** * Maps chip8 keys to PC keys. * Populated in constructor. * @memberof chip8.Keyboard * @type {Object} */ Keyboard.CHIP8_KEYS = {}; chip8.Keyboard = Keyboard; })(chip8 || (chip8 = {}));