class Keyboard { constructor(onKeydown) { this._pressed = {}; this.cb_onKeydown = onKeydown; window.addEventListener('keydown', e => this.onKeydown(e)); window.addEventListener('keyup', e => this.onKeyup(e)); window.addEventListener('touchstart', e => this.onTouchStart(e)); window.addEventListener('touchmove', e => this.onTouchMove(e)); window.addEventListener('touchend', e => this.onTouchEnd(e)); } setKeydown(fn) { this.cb_onKeydown = fn; } isDown(keyCode) { return this._pressed[keyCode]; } onKeydown(event) { this._pressed[event.code] = true; if (this.cb_onKeydown) this.cb_onKeydown(event); } onKeyup(event) { delete this._pressed[event.code]; } onTouchStart(e) { var touchobj = e.changedTouches[0] // reference first touch point (ie: first finger) this.touchX = parseInt(touchobj.clientX) // get x position of touch point relative to left edge of browser this.touchY = parseInt(touchobj.clientY) // get x position of touch point relative to left edge of browser window.dispatchEvent(new KeyboardEvent('keydown',{'code':'Space'})); window.dispatchEvent(new KeyboardEvent('keydown',{'code':'KeyN'})); e.preventDefault() } onTouchMove(e) { var touchobj = e.changedTouches[0] // reference first touch point for this event var dist = parseInt(touchobj.clientX) - this.touchX if (dist>0) { delete this._pressed['ArrowLeft']; this._pressed['ArrowRight'] = true; } else if (dist<0) { delete this._pressed['ArrowRight']; this._pressed['ArrowLeft'] = true; } else { delete this._pressed['ArrowLeft']; delete this._pressed['ArrowRight']; } dist = parseInt(touchobj.clientY) - this.touchY if (dist>0) { delete this._pressed['ArrowUp']; this._pressed['ArrowDown'] = true; } else if (dist<0) { delete this._pressed['ArrowDown']; this._pressed['ArrowUp'] = true; } else { delete this._pressed['ArrowUp']; delete this._pressed['ArrowDown']; } e.preventDefault() } onTouchEnd(e) { this._pressed = {}; } }