keyboard_input_manager.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. function KeyboardInputManager() {
  2. this.events = {};
  3. if (window.navigator.msPointerEnabled) {
  4. //Internet Explorer 10 style
  5. this.eventTouchstart = "MSPointerDown";
  6. this.eventTouchmove = "MSPointerMove";
  7. this.eventTouchend = "MSPointerUp";
  8. } else {
  9. this.eventTouchstart = "touchstart";
  10. this.eventTouchmove = "touchmove";
  11. this.eventTouchend = "touchend";
  12. }
  13. this.listen();
  14. }
  15. KeyboardInputManager.prototype.on = function (event, callback) {
  16. if (!this.events[event]) {
  17. this.events[event] = [];
  18. }
  19. this.events[event].push(callback);
  20. };
  21. KeyboardInputManager.prototype.emit = function (event, data) {
  22. var callbacks = this.events[event];
  23. if (callbacks) {
  24. callbacks.forEach(function (callback) {
  25. callback(data);
  26. });
  27. }
  28. };
  29. KeyboardInputManager.prototype.listen = function () {
  30. var self = this;
  31. var map = {
  32. 38: 0, // Up
  33. 39: 1, // Right
  34. 40: 2, // Down
  35. 37: 3, // Left
  36. 75: 0, // Vim up
  37. 76: 1, // Vim right
  38. 74: 2, // Vim down
  39. 72: 3, // Vim left
  40. 87: 0, // W
  41. 68: 1, // D
  42. 83: 2, // S
  43. 65: 3 // A
  44. };
  45. // Respond to direction keys
  46. document.addEventListener("keydown", function (event) {
  47. var modifiers = event.altKey || event.ctrlKey || event.metaKey ||
  48. event.shiftKey;
  49. var mapped = map[event.which];
  50. if (!modifiers) {
  51. if (mapped !== undefined) {
  52. event.preventDefault();
  53. self.emit("move", mapped);
  54. }
  55. }
  56. // R key restarts the game
  57. if (!modifiers && event.which === 82) {
  58. self.restart.call(self, event);
  59. }
  60. });
  61. // Respond to button presses
  62. this.bindButtonPress(".retry-button", this.restart);
  63. this.bindButtonPress(".restart-button", this.restart);
  64. this.bindButtonPress(".keep-playing-button", this.keepPlaying);
  65. // Respond to swipe events
  66. var touchStartClientX, touchStartClientY;
  67. var gameContainer = document.getElementsByClassName("game-container")[0];
  68. gameContainer.addEventListener(this.eventTouchstart, function (event) {
  69. if ((!window.navigator.msPointerEnabled && event.touches.length > 1) ||
  70. event.targetTouches > 1) {
  71. return; // Ignore if touching with more than 1 finger
  72. }
  73. if (window.navigator.msPointerEnabled) {
  74. touchStartClientX = event.pageX;
  75. touchStartClientY = event.pageY;
  76. } else {
  77. touchStartClientX = event.touches[0].clientX;
  78. touchStartClientY = event.touches[0].clientY;
  79. }
  80. event.preventDefault();
  81. });
  82. gameContainer.addEventListener(this.eventTouchmove, function (event) {
  83. event.preventDefault();
  84. });
  85. gameContainer.addEventListener(this.eventTouchend, function (event) {
  86. if ((!window.navigator.msPointerEnabled && event.touches.length > 0) ||
  87. event.targetTouches > 0) {
  88. return; // Ignore if still touching with one or more fingers
  89. }
  90. var touchEndClientX, touchEndClientY;
  91. if (window.navigator.msPointerEnabled) {
  92. touchEndClientX = event.pageX;
  93. touchEndClientY = event.pageY;
  94. } else {
  95. touchEndClientX = event.changedTouches[0].clientX;
  96. touchEndClientY = event.changedTouches[0].clientY;
  97. }
  98. var dx = touchEndClientX - touchStartClientX;
  99. var absDx = Math.abs(dx);
  100. var dy = touchEndClientY - touchStartClientY;
  101. var absDy = Math.abs(dy);
  102. if (Math.max(absDx, absDy) > 10) {
  103. // (right : left) : (down : up)
  104. self.emit("move", absDx > absDy ? (dx > 0 ? 1 : 3) : (dy > 0 ? 2 : 0));
  105. }
  106. });
  107. };
  108. KeyboardInputManager.prototype.restart = function (event) {
  109. event.preventDefault();
  110. this.emit("restart");
  111. };
  112. KeyboardInputManager.prototype.keepPlaying = function (event) {
  113. event.preventDefault();
  114. this.emit("keepPlaying");
  115. };
  116. KeyboardInputManager.prototype.bindButtonPress = function (selector, fn) {
  117. var button = document.querySelector(selector);
  118. button.addEventListener("click", fn.bind(this));
  119. button.addEventListener(this.eventTouchend, fn.bind(this));
  120. };