keyboard_input_manager.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. function one(){
  16. }
  17. KeyboardInputManager.prototype.on = function(event, callback) {
  18. if (!this.events[event]) {
  19. this.events[event] = [];
  20. }
  21. this.events[event].push(callback);
  22. };
  23. KeyboardInputManager.prototype.emit = function(event, data) {
  24. var callbacks = this.events[event];
  25. if (callbacks) {
  26. callbacks.forEach(function(callback) {
  27. callback(data);
  28. });
  29. }
  30. };
  31. KeyboardInputManager.prototype.listen = function() {
  32. var self = this;
  33. var map = {
  34. 38: 0, // Up
  35. 39: 1, // Right
  36. 40: 2, // Down
  37. 37: 3, // Left
  38. 75: 0, // Vim up
  39. 76: 1, // Vim right
  40. 74: 2, // Vim down
  41. 72: 3, // Vim left
  42. 87: 0, // W
  43. 68: 1, // D
  44. 83: 2, // S
  45. 65: 3 // A
  46. };
  47. // Respond to direction keys
  48. document.addEventListener("keydown", function(event) {
  49. var modifiers = event.altKey || event.ctrlKey || event.metaKey ||
  50. event.shiftKey;
  51. var mapped = map[event.which];
  52. if (!modifiers) {
  53. if (mapped !== undefined) {
  54. event.preventDefault();
  55. self.emit("move", mapped);
  56. }
  57. }
  58. // R key restarts the gameR键重新启动游戏
  59. if (!modifiers && event.which === 27) {
  60. self.restart.call(self, event);
  61. }else if (!modifiers && event.which === 13) {
  62. self.restart.call(self, event);
  63. }
  64. });
  65. // Respond to button presses
  66. // 响应按下按钮
  67. this.bindButtonPress(".retry-button", this.restart);
  68. this.bindButtonPress(".restart-button", this.restart);
  69. this.bindButtonPress(".keep-playing-button", this.keepPlaying);
  70. // Respond to swipe events响应滑动事件
  71. var touchStartClientX, touchStartClientY;
  72. var gameContainer = document.getElementsByClassName("game-container")[0];
  73. gameContainer.addEventListener(this.eventTouchstart, function(event) {
  74. if ((!window.navigator.msPointerEnabled && event.touches.length > 1) ||
  75. event.targetTouches > 1) {
  76. return; // Ignore if touching with more than 1 finger如果超过一个手指触摸,忽略
  77. }
  78. if (window.navigator.msPointerEnabled) {
  79. touchStartClientX = event.pageX;
  80. touchStartClientY = event.pageY;
  81. } else {
  82. touchStartClientX = event.touches[0].clientX;
  83. touchStartClientY = event.touches[0].clientY;
  84. }
  85. event.preventDefault();
  86. });
  87. gameContainer.addEventListener(this.eventTouchmove, function(event) {
  88. event.preventDefault();
  89. });
  90. gameContainer.addEventListener(this.eventTouchend, function(event) {
  91. if ((!window.navigator.msPointerEnabled && event.touches.length > 0) ||
  92. event.targetTouches > 0) {
  93. return; // Ignore if still touching with one or more fingers如果仍用一个或多个手指触摸,则忽略
  94. }
  95. var touchEndClientX, touchEndClientY;
  96. if (window.navigator.msPointerEnabled) {
  97. touchEndClientX = event.pageX;
  98. touchEndClientY = event.pageY;
  99. } else {
  100. touchEndClientX = event.changedTouches[0].clientX;
  101. touchEndClientY = event.changedTouches[0].clientY;
  102. }
  103. var dx = touchEndClientX - touchStartClientX;
  104. var absDx = Math.abs(dx);
  105. var dy = touchEndClientY - touchStartClientY;
  106. var absDy = Math.abs(dy);
  107. if (Math.max(absDx, absDy) > 10) {
  108. // (right : left) : (down : up)
  109. self.emit("move", absDx > absDy ? (dx > 0 ? 1 : 3) : (dy > 0 ? 2 : 0));
  110. }
  111. });
  112. };
  113. KeyboardInputManager.prototype.restart = function(event) {
  114. event.preventDefault();
  115. this.emit("restart");
  116. };
  117. KeyboardInputManager.prototype.keepPlaying = function(event) {
  118. event.preventDefault();
  119. this.emit("keepPlaying");
  120. };
  121. KeyboardInputManager.prototype.bindButtonPress = function(selector, fn) {
  122. var button = document.querySelector(selector);
  123. button.addEventListener("click", fn.bind(this));
  124. button.addEventListener(this.eventTouchend, fn.bind(this));
  125. };