Path: blob/main/public/games/files/2048/js/keyboard_input_manager.js
1036 views
function KeyboardInputManager() {1this.events = {};23if (window.navigator.msPointerEnabled) {4//Internet Explorer 10 style5this.eventTouchstart = "MSPointerDown";6this.eventTouchmove = "MSPointerMove";7this.eventTouchend = "MSPointerUp";8} else {9this.eventTouchstart = "touchstart";10this.eventTouchmove = "touchmove";11this.eventTouchend = "touchend";12}1314this.listen();15}1617KeyboardInputManager.prototype.on = function (event, callback) {18if (!this.events[event]) {19this.events[event] = [];20}21this.events[event].push(callback);22};2324KeyboardInputManager.prototype.emit = function (event, data) {25var callbacks = this.events[event];26if (callbacks) {27callbacks.forEach(function (callback) {28callback(data);29});30}31};3233KeyboardInputManager.prototype.listen = function () {34var self = this;3536var map = {3738: 0, // Up3839: 1, // Right3940: 2, // Down4037: 3, // Left4175: 0, // Vim up4276: 1, // Vim right4374: 2, // Vim down4472: 3, // Vim left4587: 0, // W4668: 1, // D4783: 2, // S4865: 3 // A49};5051// Respond to direction keys52document.addEventListener("keydown", function (event) {53var modifiers = event.altKey || event.ctrlKey || event.metaKey ||54event.shiftKey;55var mapped = map[event.which];5657if (!modifiers) {58if (mapped !== undefined) {59event.preventDefault();60self.emit("move", mapped);61}62}6364// R key restarts the game65if (!modifiers && event.which === 82) {66self.restart.call(self, event);67}68});6970// Respond to button presses71this.bindButtonPress(".retry-button", this.restart);72this.bindButtonPress(".restart-button", this.restart);73this.bindButtonPress(".keep-playing-button", this.keepPlaying);7475// Respond to swipe events76var touchStartClientX, touchStartClientY;77var gameContainer = document.getElementsByClassName("game-container")[0];7879gameContainer.addEventListener(this.eventTouchstart, function (event) {80if ((!window.navigator.msPointerEnabled && event.touches.length > 1) ||81event.targetTouches.length > 1) {82return; // Ignore if touching with more than 1 finger83}8485if (window.navigator.msPointerEnabled) {86touchStartClientX = event.pageX;87touchStartClientY = event.pageY;88} else {89touchStartClientX = event.touches[0].clientX;90touchStartClientY = event.touches[0].clientY;91}9293event.preventDefault();94});9596gameContainer.addEventListener(this.eventTouchmove, function (event) {97event.preventDefault();98});99100gameContainer.addEventListener(this.eventTouchend, function (event) {101if ((!window.navigator.msPointerEnabled && event.touches.length > 0) ||102event.targetTouches.length > 0) {103return; // Ignore if still touching with one or more fingers104}105106var touchEndClientX, touchEndClientY;107108if (window.navigator.msPointerEnabled) {109touchEndClientX = event.pageX;110touchEndClientY = event.pageY;111} else {112touchEndClientX = event.changedTouches[0].clientX;113touchEndClientY = event.changedTouches[0].clientY;114}115116var dx = touchEndClientX - touchStartClientX;117var absDx = Math.abs(dx);118119var dy = touchEndClientY - touchStartClientY;120var absDy = Math.abs(dy);121122if (Math.max(absDx, absDy) > 10) {123// (right : left) : (down : up)124self.emit("move", absDx > absDy ? (dx > 0 ? 1 : 3) : (dy > 0 ? 2 : 0));125}126});127};128129KeyboardInputManager.prototype.restart = function (event) {130event.preventDefault();131this.emit("restart");132};133134KeyboardInputManager.prototype.keepPlaying = function (event) {135event.preventDefault();136this.emit("keepPlaying");137};138139KeyboardInputManager.prototype.bindButtonPress = function (selector, fn) {140var button = document.querySelector(selector);141button.addEventListener("click", fn.bind(this));142button.addEventListener(this.eventTouchend, fn.bind(this));143};144145146