topical media & game development

talk show tell print

mobile-query-three-vendor-threex-examples-threex.domevent-vendor-threex-THREEx.KeyboardState.js / js



  // THREEx.KeyboardState.js keep the current state of the keyboard.
  // It is possible to query it at any time. No need of an event.
  // This is particularly convenient in loop driven case, like in
  // 3D demos or games.
  //
  // # Usage
  //
  // **Step 1**: Create the object
  //
  // ```var keyboard        = new THREEx.KeyboardState();```
  //
  // **Step 2**: Query the keyboard state
  //
  // This will return true if shift and A are pressed, false otherwise
  //
  // ```keyboard.pressed("shift+A")```
  //
  // **Step 3**: Stop listening to the keyboard
  //
  // ```keyboard.destroy()```
  //
  // NOTE: this library may be nice as standaline. independant from three.js
  // - rename it keyboardForGame
  //
  // # Code
  //
  
  
@namespace

  
  var THREEx        = THREEx                 || {};
  
  
- NOTE: it would be quite easy to push event-driven too - microevent.js for events handling - in this._onkeyChange, generate a string from the DOM event - use this as event name

  
  THREEx.KeyboardState        = function()
  {
          // to store the current state
          this.keyCodes        = {};
          this.modifiers        = {};
          
          // create callback to bind/unbind keyboard events
          var self        = this;
          this._onKeyDown        = function(event){ self._onKeyChange(event, true); };
          this._onKeyUp        = function(event){ self._onKeyChange(event, false);};
  
          // bind keyEvents
          document.addEventListener("keydown", this._onKeyDown, false);
          document.addEventListener("keyup", this._onKeyUp, false);
  }
  
  
To stop listening of the keyboard events

  
  THREEx.KeyboardState.prototype.destroy        = function()
  {
          // unbind keyEvents
          document.removeEventListener("keydown", this._onKeyDown, false);
          document.removeEventListener("keyup", this._onKeyUp, false);
  }
  
  THREEx.KeyboardState.MODIFIERS        = ['shift', 'ctrl', 'alt', 'meta'];
  THREEx.KeyboardState.ALIAS        = {
          'left'                : 37,
          'up'                : 38,
          'right'                : 39,
          'down'                : 40,
          'space'                : 32,
          'pageup'        : 33,
          'pagedown'        : 34,
          'tab'                : 9
  };
  
  
to process the keyboard dom event

  
  THREEx.KeyboardState.prototype._onKeyChange        = function(event, pressed)
  {
          // log to debug
          //console.log("onKeyChange", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)
  
          // update this.keyCodes
          var keyCode                = event.keyCode;
          this.keyCodes[keyCode]        = pressed;
  
          // update this.modifiers
          this.modifiers['shift']= event.shiftKey;
          this.modifiers['ctrl']        = event.ctrlKey;
          this.modifiers['alt']        = event.altKey;
          this.modifiers['meta']        = event.metaKey;
  }
  
  
query keyboard state to know if a key is pressed of not
parameter: {String} keyDesc the description of the key. format : modifiers+key e.g shift+A
returns: {Boolean} true if the key is pressed, false otherwise

  
  THREEx.KeyboardState.prototype.pressed        = function(keyDesc)
  {
          var keys        = keyDesc.split("+");
          for(var i = 0; i < keys.length; i++){
                  var key                = keys[i];
                  var pressed;
                  if( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){
                          pressed        = this.modifiers[key];
                  }else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){
                          pressed        = this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];
                  }else {
                          pressed        = this.keyCodes[key.toUpperCase().charCodeAt(0)]
                  }
                  if( !pressed)        return false;
          };
          return true;
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.