PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/Three.js/js/KeyboardState.js

https://github.com/minamic/stemkoski.github.com
JavaScript | 124 lines | 61 code | 9 blank | 54 comment | 7 complexity | fefb1ce525bfdbb01474cb7d950dbd8b MD5 | raw file
  1. // THREEx.KeyboardState.js keep the current state of the keyboard.
  2. // It is possible to query it at any time. No need of an event.
  3. // This is particularly convenient in loop driven case, like in
  4. // 3D demos or games.
  5. //
  6. // # Usage
  7. //
  8. // **Step 1**: Create the object
  9. //
  10. // ```var keyboard = new KeyboardState();```
  11. //
  12. // **Step 2**: Query the keyboard state
  13. //
  14. // This will return true if shift and A are pressed, false otherwise
  15. //
  16. // ```keyboard.pressed("shift+A")```
  17. //
  18. // **Step 3**: Stop listening to the keyboard
  19. //
  20. // ```keyboard.destroy()```
  21. //
  22. // NOTE: this library may be nice as standaline. independant from three.js
  23. // - rename it keyboardForGame
  24. //
  25. // author: Jerome Etienne
  26. //
  27. // # Code
  28. //
  29. /**
  30. * - NOTE: it would be quite easy to push event-driven too
  31. * - microevent.js for events handling
  32. * - in this._onkeyChange, generate a string from the DOM event
  33. * - use this as event name
  34. */
  35. KeyboardState = function()
  36. {
  37. // to store the current state
  38. this.keyCodes = {};
  39. this.modifiers = {};
  40. // create callback to bind/unbind keyboard events
  41. var self = this;
  42. this._onKeyDown = function(event){ self._onKeyChange(event, true); };
  43. this._onKeyUp = function(event){ self._onKeyChange(event, false);};
  44. // bind keyEvents
  45. document.addEventListener("keydown", this._onKeyDown, false);
  46. document.addEventListener("keyup", this._onKeyUp, false);
  47. }
  48. /**
  49. * To stop listening of the keyboard events
  50. */
  51. KeyboardState.prototype.destroy = function()
  52. {
  53. // unbind keyEvents
  54. document.removeEventListener("keydown", this._onKeyDown, false);
  55. document.removeEventListener("keyup", this._onKeyUp, false);
  56. }
  57. KeyboardState.MODIFIERS = ['shift', 'ctrl', 'alt', 'meta'];
  58. KeyboardState.ALIAS = {
  59. 'left' : 37,
  60. 'up' : 38,
  61. 'right' : 39,
  62. 'down' : 40,
  63. 'space' : 32,
  64. 'pageup' : 33,
  65. 'pagedown' : 34,
  66. 'enter' : 13,
  67. 'escape' : 27,
  68. 'lbracket' : 219,
  69. 'rbracket' : 221,
  70. 'tab' : 9
  71. };
  72. /**
  73. * to process the keyboard dom event
  74. */
  75. KeyboardState.prototype._onKeyChange = function(event, pressed)
  76. {
  77. // log to debug
  78. //console.log("onKeyChange", event, pressed, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)
  79. // update this.keyCodes
  80. var keyCode = event.keyCode;
  81. this.keyCodes[keyCode] = pressed;
  82. // update this.modifiers
  83. this.modifiers['shift']= event.shiftKey;
  84. this.modifiers['ctrl'] = event.ctrlKey;
  85. this.modifiers['alt'] = event.altKey;
  86. this.modifiers['meta'] = event.metaKey;
  87. }
  88. /**
  89. * query keyboard state to know if a key is pressed of not
  90. *
  91. * @param {String} keyDesc the description of the key. format : modifiers+key e.g shift+A
  92. * @returns {Boolean} true if the key is pressed, false otherwise
  93. */
  94. KeyboardState.prototype.pressed = function(keyDesc)
  95. {
  96. var keys = keyDesc.split("+");
  97. for(var i = 0; i < keys.length; i++){
  98. var key = keys[i];
  99. var pressed;
  100. if( KeyboardState.MODIFIERS.indexOf( key ) !== -1 )
  101. {
  102. pressed = this.modifiers[key];
  103. }
  104. else if( Object.keys(KeyboardState.ALIAS).indexOf( key ) != -1 )
  105. {
  106. pressed = this.keyCodes[ KeyboardState.ALIAS[key] ];
  107. }
  108. else
  109. {
  110. pressed = this.keyCodes[key.toUpperCase().charCodeAt(0)]
  111. }
  112. if( !pressed ) return false;
  113. };
  114. return true;
  115. }