Source: Core/Engine_Input.js

  1. /*
  2. * File: EngineCore_Input.js
  3. * Provides input support
  4. */
  5. /*jslint node: true, vars: true */
  6. /*global document, window*/
  7. /* find out more about jslint: http://www.jslint.com/help.html */
  8. "use strict"; // Operate in Strict mode such that variables must be declared before used!
  9. /**
  10. * Static refrence to gEngine
  11. * @type gEngine
  12. */
  13. var gEngine = gEngine || { };
  14. /**
  15. * Input Class
  16. * @class gEngine.Input
  17. * @type gEngine.Input
  18. */
  19. gEngine.Input = (function () {
  20. // Key code constants
  21. /**
  22. * @memberOf gEngine.Input
  23. * @type{enum} kKeys - Input keyCodes.
  24. */
  25. var kKeys = {
  26. Backspace: 8,
  27. Enter: 13,
  28. // arrows
  29. Left: 37,
  30. Up: 38,
  31. Right: 39,
  32. Down: 40,
  33. // space bar
  34. Space: 32,
  35. // numbers
  36. Zero: 48,
  37. One: 49,
  38. Two: 50,
  39. Three: 51,
  40. Four: 52,
  41. Five : 53,
  42. Six : 54,
  43. Seven : 55,
  44. Eight : 56,
  45. Nine : 57,
  46. // Alphabets
  47. A : 65,
  48. B : 66,
  49. C : 67,
  50. D : 68,
  51. E : 69,
  52. F : 70,
  53. G : 71,
  54. H : 72,
  55. I : 73,
  56. J : 74,
  57. K : 75,
  58. L : 76,
  59. M : 77,
  60. N : 78,
  61. O : 79,
  62. P : 80,
  63. Q : 81,
  64. R : 82,
  65. S : 83,
  66. T : 84,
  67. U : 85,
  68. V : 86,
  69. W : 87,
  70. X : 88,
  71. Y : 89,
  72. Z : 90,
  73. LastKeyCode: 222
  74. };
  75. /**
  76. * @memberOf gEngine.Input
  77. * @type{enum} mouseButton - Mouse button input codes.
  78. */
  79. var kMouseButton = {
  80. Left: 0,
  81. Middle: 1,
  82. Right: 2
  83. };
  84. // Previous key state
  85. var mKeyPreviousState = []; // a new array
  86. // The pressed keys.
  87. var mIsKeyPressed = [];
  88. // Click events: once an event is set, it will remain there until polled
  89. var mIsKeyClicked = [];
  90. //Released events: whether a button is released
  91. var mIsKeyReleased = [];
  92. // Support mouse
  93. var mCanvas = null;
  94. var mButtonPreviousState = [];
  95. var mIsButtonPressed = [];
  96. var mIsButtonClicked = [];
  97. var mIsButtonReleased = [];
  98. var mMousePosX = -1;
  99. var mMousePosY = -1;
  100. // <editor-fold desc="Event handler functions">
  101. //<editor-fold desc="Keyboard handlers">
  102. var _onKeyDown = function (event) {
  103. mIsKeyPressed[event.keyCode] = true;
  104. mIsKeyReleased[event.keyCode] = false;
  105. };
  106. var _onKeyUp = function (event) {
  107. mIsKeyPressed[event.keyCode] = false;
  108. mIsKeyReleased[event.keyCode] = true;
  109. };
  110. //</editor-fold>
  111. //<editor-fold desc="Mouse handlers">
  112. var _onMouseMove = function (event) {
  113. var inside = false;
  114. var bBox = mCanvas.getBoundingClientRect();
  115. // In Canvas Space now. Convert via ratio from canvas to client.
  116. var x = Math.round((event.clientX - bBox.left) * (mCanvas.width / bBox.width));
  117. var y = Math.round((event.clientY - bBox.top) * (mCanvas.width / bBox.width));
  118. if ((x >= 0) && (x < mCanvas.width) &&
  119. (y >= 0) && (y < mCanvas.height)) {
  120. mMousePosX = x;
  121. mMousePosY = mCanvas.height - 1 - y;
  122. inside = true;
  123. }
  124. return inside;
  125. };
  126. // Mouse down event listener
  127. var _onMouseDown = function (event) {
  128. if (_onMouseMove(event)) {
  129. mIsButtonPressed[event.button] = true;
  130. mIsButtonReleased[event.button] = false;
  131. }
  132. };
  133. // Mouse up event listener
  134. var _onMouseUp = function (event) {
  135. _onMouseMove(event);
  136. mIsButtonPressed[event.button] = false;
  137. mIsButtonReleased[event.button] = true;
  138. };
  139. //</editor-fold>
  140. //</editor-fold>
  141. /**
  142. * Initialize the input manager.<p>
  143. * Intitalize and intsntiate input listeners.
  144. * @memberOf gEngine.Input
  145. * @param {GLCanvas} canvasID - HTML canvas
  146. * @returns {void}
  147. */
  148. var initialize = function (canvasID) {
  149. //<editor-fold desc="Keyboard support">
  150. var i;
  151. for (i = 0; i < kKeys.LastKeyCode; i++) {
  152. mIsKeyPressed[i] = false;
  153. mKeyPreviousState[i] = false;
  154. mIsKeyClicked[i] = false;
  155. mIsKeyReleased[i] = false;
  156. }
  157. // register handlers
  158. window.addEventListener('keyup', _onKeyUp);
  159. window.addEventListener('keydown', _onKeyDown);
  160. //</editor-fold>
  161. //<editor-fold desc="Mouse support">
  162. for (i = 0; i < 3; i++) {
  163. mButtonPreviousState[i] = false;
  164. mIsButtonPressed[i] = false;
  165. mIsButtonClicked[i] = false;
  166. mIsButtonReleased[i] =false;
  167. }
  168. window.addEventListener('mousedown', _onMouseDown);
  169. window.addEventListener('mouseup', _onMouseUp);
  170. window.addEventListener('mousemove', _onMouseMove);
  171. mCanvas = document.getElementById(canvasID);
  172. //</editor-fold>
  173. };
  174. /**
  175. * Update function called on Gameloop.
  176. * @memberOf gEngine.Input
  177. * @returns {void}
  178. */
  179. var update = function () {
  180. var i;
  181. for (i = 0; i < kKeys.LastKeyCode; i++) {
  182. mIsKeyClicked[i] = (!mKeyPreviousState[i]) && mIsKeyPressed[i];
  183. mIsKeyReleased[i] = mKeyPreviousState[i] && (!mIsKeyPressed[i]);
  184. mKeyPreviousState[i] = mIsKeyPressed[i];
  185. }
  186. for (i = 0; i < 3; i++) {
  187. mIsButtonClicked[i] = (!mButtonPreviousState[i]) && mIsButtonPressed[i];
  188. mIsButtonReleased[i] = mButtonPreviousState[i] && (!mIsButtonPressed[i]);
  189. mButtonPreviousState[i] = mIsButtonPressed[i];
  190. }
  191. };
  192. /**
  193. * Function for GameEngine programmer to test if a key is pressed down<p>
  194. * returns if key is pressed.
  195. * @memberOf gEngine.Input
  196. * @param {Number|keys} keyCode - key to check for pressed state.
  197. * @returns {Boolean} true if key is pressed
  198. */
  199. var isKeyPressed = function (keyCode) {
  200. return mIsKeyPressed[keyCode];
  201. };
  202. /**
  203. * returns if key is clicked.
  204. * @memberOf gEngine.Input
  205. * @param {Number|keys} keyCode - key to check for clicked state.
  206. * @returns {Boolean} true if key is clicked
  207. */
  208. var isKeyClicked = function (keyCode) {
  209. return (mIsKeyClicked[keyCode]);
  210. };
  211. /**
  212. * returns if key is released.
  213. * @memberOf gEngine.Input
  214. * @param {Number|keys} keyCode - key to check for released state.
  215. * @returns {Boolean} true if key is released
  216. */
  217. var isKeyReleased = function (keyCode) {
  218. return (mIsKeyReleased[keyCode]);
  219. };
  220. /**
  221. * returns if button is pressed.
  222. * @memberOf gEngine.Input
  223. * @param {Number|mouseButton} button - button to check for pressed state.
  224. * @returns {Boolean} true if button is pressed.
  225. */
  226. var isButtonPressed = function (button) {
  227. return mIsButtonPressed[button];
  228. };
  229. /**
  230. * returns if button is clicked.
  231. * @memberOf gEngine.Input
  232. * @param {Number|mouseButton} button - button to check for ckicked state.
  233. * @returns {Boolean} true if button is clicked.
  234. */
  235. var isButtonClicked = function (button) {
  236. return mIsButtonClicked[button];
  237. };
  238. /**
  239. * returns if button is released.
  240. * @memberOf gEngine.Input
  241. * @param {Number|mouseButton} button - button to check for release state.
  242. * @returns {Boolean} true if button is released
  243. */
  244. var isButtonReleased = function(button) {
  245. return mIsButtonReleased[button];
  246. };
  247. /**
  248. * Returns mouse X position.
  249. * @memberOf gEngine.Input
  250. * @returns {Number} X position of mouse.
  251. */
  252. var getMousePosX = function () { return mMousePosX; };
  253. /**
  254. * Returns mouse Y position.
  255. * @memberOf gEngine.Input
  256. * @returns {Number} Y position of mouse.
  257. */
  258. var getMousePosY = function () { return mMousePosY; };
  259. var mPublic = {
  260. initialize: initialize,
  261. update: update,
  262. // keyboard support
  263. isKeyPressed: isKeyPressed,
  264. isKeyClicked: isKeyClicked,
  265. isKeyReleased: isKeyReleased,
  266. keys: kKeys,
  267. // Mouse support
  268. isButtonPressed: isButtonPressed,
  269. isButtonClicked: isButtonClicked,
  270. isButtonReleased: isButtonReleased,
  271. getMousePosX: getMousePosX, // invalid if no corresponding buttonPressed or buttonClicked
  272. getMousePosY: getMousePosY,
  273. mouseButton: kMouseButton
  274. };
  275. return mPublic;
  276. }());