docs: function GameShell() {
    EventEmitter.call(this)
    this._curKeyState  = new Array(keyNames.length)
    this._pressCount   = new Array(keyNames.length)
    this._releaseCount = new Array(keyNames.length)
    
    this._tickInterval = null
    this._rafHandle = null
    this._tickRate = 0
    this._lastTick = hrtime()
    this._frameTime = 0.0
    this._paused = true
    this._width = 0
    this._height = 0
    
    this._wantFullscreen = false
    this._wantPointerLock = false
    this._fullscreenActive = false
    this._pointerLockActive = false
    
    this._rafFunction = tickOrRender.bind(undefined, this, true)
  
    this.preventDefaults = true
    this.stopPropagation = false
    
    for(var i=0; i<keyNames.length; ++i) {
      this._curKeyState[i] = false
      this._pressCount[i] = this._releaseCount[i] = 0
    }
    
    //Public members
    this.element = null
    this.bindings = {}
    this.frameSkip = 100.0
    this.tickCount = 0
    this.frameCount = 0
    this.startTime = hrtime()
    this.tickTime = this._tickRate
    this.frameTime = 10.0
    this.stickyFullscreen = false
    this.stickyPointerLock = false
    
    //Scroll stuff
    this.scroll = [0,0,0]
      
    //Mouse state
    this.mouseX = 0
    this.mouseY = 0
    this.prevMouseX = 0
    this.prevMouseY = 0
  }