You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

196 lines
3.7 KiB

  1. define([
  2. 'js/system/events',
  3. 'js/rendering/renderer'
  4. ], function (
  5. events,
  6. renderer
  7. ) {
  8. return {
  9. axes: {
  10. horizontal: {
  11. negative: ['left', 'a', 'q', 'z'],
  12. positive: ['right', 'd', 'e', 'c']
  13. },
  14. vertical: {
  15. negative: ['up', 'w', 'q', 'e'],
  16. positive: ['down', 's', 'x', 'z', 'c']
  17. }
  18. },
  19. mappings: {
  20. 8: 'backspace',
  21. 9: 'tab',
  22. 13: 'enter',
  23. 16: 'shift',
  24. 17: 'ctrl',
  25. 27: 'esc',
  26. 37: 'left',
  27. 38: 'up',
  28. 39: 'right',
  29. 40: 'down',
  30. 46: 'del',
  31. //hacks for mac cmd key
  32. 17: 'ctrl',
  33. 224: 'ctrl',
  34. 91: 'ctrl',
  35. 93: 'ctrl'
  36. },
  37. mouse: {
  38. button: null,
  39. x: 0,
  40. y: 0
  41. },
  42. mouseRaw: null,
  43. keys: {},
  44. enabled: true,
  45. init: function () {
  46. $(window).on('keydown', this.events.keyboard.keyDown.bind(this));
  47. $(window).on('keyup', this.events.keyboard.keyUp.bind(this));
  48. events.on('onSceneMove', this.events.mouse.mouseMove.bind(this));
  49. $('.ui-container')
  50. .on('mousedown', this.events.mouse.mouseDown.bind(this))
  51. .on('mouseup', this.events.mouse.mouseUp.bind(this))
  52. .on('mousemove', this.events.mouse.mouseMove.bind(this));
  53. },
  54. resetKeys: function () {
  55. for (let k in this.keys)
  56. events.emit('onKeyUp', k);
  57. this.keys = {};
  58. },
  59. getMapping: function (charCode) {
  60. if (charCode >= 97)
  61. return (charCode - 96).toString();
  62. return (
  63. this.mappings[charCode] ||
  64. String.fromCharCode(charCode).toLowerCase()
  65. );
  66. },
  67. isKeyDown: function (key, noConsume) {
  68. let down = this.keys[key];
  69. if (down != null) {
  70. if (noConsume)
  71. return true;
  72. this.keys[key] = 2;
  73. return (down == 1);
  74. } return false;
  75. },
  76. getAxis: function (name) {
  77. let axis = this.axes[name];
  78. if (!axis)
  79. return 0;
  80. let result = 0;
  81. for (var i = 0; i < axis.negative.length; i++) {
  82. if (this.keys[axis.negative[i]]) {
  83. result--;
  84. break;
  85. }
  86. }
  87. for (var i = 0; i < axis.positive.length; i++) {
  88. if (this.keys[axis.positive[i]]) {
  89. result++;
  90. break;
  91. }
  92. }
  93. return result;
  94. },
  95. events: {
  96. keyboard: {
  97. keyDown: function (e) {
  98. if (!this.enabled)
  99. return;
  100. if (e.target != document.body)
  101. return true;
  102. if ((e.keyCode == 9) || (e.keyCode == 8) || (e.keyCode == 122))
  103. e.preventDefault();
  104. let key = this.getMapping(e.which);
  105. if (this.keys[key] != null)
  106. this.keys[key] = 2;
  107. else {
  108. this.keys[key] = 1;
  109. events.emit('onKeyDown', key);
  110. }
  111. if (key == 'backspace')
  112. return false;
  113. else if (e.key == 'F11')
  114. events.emit('onToggleFullscreen');
  115. },
  116. keyUp: function (e) {
  117. if (!this.enabled)
  118. return;
  119. if (e.target != document.body)
  120. return;
  121. let key = this.getMapping(e.which);
  122. delete this.keys[key];
  123. events.emit('onKeyUp', key);
  124. }
  125. },
  126. mouse: {
  127. mouseDown: function (e) {
  128. let el = $(e.target);
  129. if ((!el.hasClass('ui-container')) || (el.hasClass('blocking')))
  130. return;
  131. let button = e.button;
  132. this.mouse.button = button;
  133. this.mouse.down = true;
  134. this.mouse.event = e;
  135. events.emit('mouseDown', this.mouse);
  136. },
  137. mouseUp: function (e) {
  138. let el = $(e.target);
  139. if ((!el.hasClass('ui-container')) || (el.hasClass('blocking')))
  140. return;
  141. let button = e.button;
  142. this.mouse.button = null;
  143. this.mouse.down = false;
  144. events.emit('mouseUp', this.mouse);
  145. },
  146. mouseMove: function (e) {
  147. if (e)
  148. this.mouseRaw = e;
  149. else
  150. e = this.mouseRaw;
  151. if (!e)
  152. return;
  153. let el = $(e.target);
  154. if ((!el.hasClass('ui-container')) || (el.hasClass('blocking')))
  155. return;
  156. this.mouse.x = e.offsetX + (renderer.pos.x);
  157. this.mouse.y = e.offsetY + (renderer.pos.y);
  158. }
  159. }
  160. }
  161. };
  162. });