Endless Game. Allow user to continue the game.
[2048.git] / js / keyboard_input_manager.js
Gabriele Cirulli








Chris Price



















Gabriele Cirulli




Gabriele Cirulli


Gabriele Cirulli
Gabriele Cirulli


Gabriele Cirulli






Gabriele Cirulli

Gabriele Cirulli
Laurent Margirier
Gabriele Cirulli
G. Bodenschatz
Gabriele Cirulli
Laurent Margirier


Gabriele Cirulli
Chris Price
Gabriele Cirulli
Gabriele Cirulli



Chris Price
Gabriele Cirulli
Chris Price
Gabriele Cirulli
Gabriele Cirulli

Chris Price

Gabriele Cirulli



Chris Price

Gabriele Cirulli
Chris Price

Gabriele Cirulli

Gabriele Cirulli

Chris Price
Gabriele Cirulli
Gabriele Cirulli




Gabriele Cirulli
Laurent Margirier





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
function KeyboardInputManager() {
  this.events = {};
 
  this.listen();
}
 
KeyboardInputManager.prototype.on = function (event, callback) {
  if (!this.events[event]) {
    this.events[event] = [];
  }
  this.events[event].push(callback);
};
 
KeyboardInputManager.prototype.emit = function (event, data) {
  var callbacks = this.events[event];
  if (callbacks) {
    callbacks.forEach(function (callback) {
      callback(data);
    });
  }
};
 
KeyboardInputManager.prototype.listen = function () {
  var self = this;
 
  var map = {
    38: 0, // Up
    39: 1, // Right
    40: 2, // Down
    37: 3, // Left
    75: 0, // vim keybindings
    76: 1,
    74: 2,
    72: 3,
    87: 0, // W
    68: 1, // D
    83: 2, // S
    65: 3  // A
  };
 
  document.addEventListener("keydown", function (event) {
    var modifiers = event.altKey || event.ctrlKey || event.metaKey ||
                    event.shiftKey;
    var mapped    = map[event.which];
 
    if (!modifiers) {
      if (mapped !== undefined) {
        event.preventDefault();
        self.emit("move", mapped);
      }
 
      if (event.which === 32) self.restart.bind(self)(event);
    }
  });
 
  var retry = document.querySelector(".retry-button");
  retry.addEventListener("click", this.restart.bind(this));
  retry.addEventListener("touchend", this.restart.bind(this));
 
  var keepPlaying = document.querySelector(".keep-playing-button");
  keepPlaying.addEventListener("click", this.keepPlaying.bind(this));
 
  // Listen to swipe events
  var touchStartClientX, touchStartClientY;
  var gameContainer = document.getElementsByClassName("game-container")[0];
 
  gameContainer.addEventListener("touchstart", function (event) {
    if (event.touches.length > 1) return;
 
    touchStartClientX = event.touches[0].clientX;
    touchStartClientY = event.touches[0].clientY;
    event.preventDefault();
  });
 
  gameContainer.addEventListener("touchmove", function (event) {
    event.preventDefault();
  });
 
  gameContainer.addEventListener("touchend", function (event) {
    if (event.touches.length > 0) return;
 
    var dx = event.changedTouches[0].clientX - touchStartClientX;
    var absDx = Math.abs(dx);
 
    var dy = event.changedTouches[0].clientY - touchStartClientY;
    var absDy = Math.abs(dy);
 
    if (Math.max(absDx, absDy) > 10) {
      // (right : left) : (down : up)
      self.emit("move", absDx > absDy ? (dx > 0 ? 1 : 3) : (dy > 0 ? 2 : 0));
    }
  });
};
 
KeyboardInputManager.prototype.restart = function (event) {
  event.preventDefault();
  this.emit("restart");
};
 
KeyboardInputManager.prototype.keepPlaying = function (event) {
  event.preventDefault();
  this.emit("keepPlaying");
};
 
comments