diff --git a/app/Game/Client/Control/Inputs/KeyboardAndMouse.js b/app/Game/Client/Control/Inputs/KeyboardAndMouse.js index 41f555a..191f7bf 100644 --- a/app/Game/Client/Control/Inputs/KeyboardAndMouse.js +++ b/app/Game/Client/Control/Inputs/KeyboardAndMouse.js @@ -3,15 +3,18 @@ define([ "Game/Client/Control/KeyboardInput", "Game/Client/View/DomController", "Game/Config/Settings", + "Game/Client/Control/Swiper" ], -function (Parent, KeyboardInput, DomController, Settings) { +function (Parent, KeyboardInput, DomController, Settings, Swiper) { function KeyboardAndMouse(playerController) { Parent.call(this); this.x = 0; this.y = 0; + this.modifier = false; + this.swiper = null; this.playerController = playerController; this.keyboardInit(); @@ -22,7 +25,8 @@ function (Parent, KeyboardInput, DomController, Settings) { KeyboardAndMouse.prototype.keyboardInit = function() { - this.keyboardInput = new KeyboardInput(this.playerController); + this.keyboardInput = new KeyboardInput(); + var self = this; var keys = { w:87, @@ -40,8 +44,8 @@ function (Parent, KeyboardInput, DomController, Settings) { right: 39, space: 32, - tab: 9, + shift: 16, plus: 187, plusfx: 171, @@ -50,80 +54,68 @@ function (Parent, KeyboardInput, DomController, Settings) { zero: 48 } - this.keyboardInput.registerKey(keys.a, 'moveLeft', 'stop'); - this.keyboardInput.registerKey(keys.left, 'moveLeft', 'stop'); - - this.keyboardInput.registerKey(keys.d, 'moveRight', 'stop'); - this.keyboardInput.registerKey(keys.right, 'moveRight', 'stop'); - - this.keyboardInput.registerKey(keys.w, 'jump', 'jumpStop'); - this.keyboardInput.registerKey(keys.up, 'jump', 'jumpStop'); - this.keyboardInput.registerKey(keys.space, 'jump', 'jumpStop'); + function bind2Pc(methodName) { + return self.playerController[methodName].bind(self.playerController); + } - this.keyboardInput.registerKey(keys.plus, 'zoomIn'); - this.keyboardInput.registerKey(keys.plusfx, 'zoomIn'); - this.keyboardInput.registerKey(keys.minus, 'zoomOut'); - this.keyboardInput.registerKey(keys.minusfx, 'zoomOut'); - this.keyboardInput.registerKey(keys.zero, 'zoomReset'); + this.keyboardInput.registerKey(keys.a, bind2Pc('moveLeft'), bind2Pc('stop')); + this.keyboardInput.registerKey(keys.left, bind2Pc('moveLeft'), bind2Pc('stop')); + this.keyboardInput.registerKey(keys.d, bind2Pc('moveRight'), bind2Pc('stop')); + this.keyboardInput.registerKey(keys.right, bind2Pc('moveRight'), bind2Pc('stop')); + this.keyboardInput.registerKey(keys.w, bind2Pc('jump'), bind2Pc('jumpStop')); + this.keyboardInput.registerKey(keys.up, bind2Pc('jump'), bind2Pc('jumpStop')); + this.keyboardInput.registerKey(keys.space, bind2Pc('jump'), bind2Pc('jumpStop')); + this.keyboardInput.registerKey(keys.plus, bind2Pc('zoomIn')); + this.keyboardInput.registerKey(keys.plusfx, bind2Pc('zoomIn')); + this.keyboardInput.registerKey(keys.minus, bind2Pc('zoomOut')); + this.keyboardInput.registerKey(keys.minusfx, bind2Pc('zoomOut')); + this.keyboardInput.registerKey(keys.zero, bind2Pc('zoomReset')); + this.keyboardInput.registerKey(keys.tab, bind2Pc('showInfo'), bind2Pc('hideInfo')); + this.keyboardInput.registerKey(keys.f, bind2Pc('handActionLeft')); + this.keyboardInput.registerKey(keys.g, bind2Pc('handActionRight')); + this.keyboardInput.registerKey(keys.k, bind2Pc('suicide')); - this.keyboardInput.registerKey(keys.tab, 'showInfo', 'hideInfo'); - - this.keyboardInput.registerKey(keys.f, 'handActionLeft'); - this.keyboardInput.registerKey(keys.g, 'handActionRight'); - - this.keyboardInput.registerKey(keys.k, 'suicide'); + this.keyboardInput.registerKey( + keys.shift, + this.activateModifier.bind(this), + this.deactivateModifier.bind(this) + ); }; KeyboardAndMouse.prototype.mouseInit = function() { - var canvas = DomController.getCanvas(); var self = this; - canvas.onmousemove = function(e){ - - // -1 +1 +1 +1 xy scaling should - // -1 -1 +1 -1 be like this - - var movementX = e.movementX || - e.mozMovementX || - e.webkitMovementX || - 0; - - var movementY = e.movementY || - e.mozMovementY || - e.webkitMovementY || - 0; - - self.x += movementX / Settings.VIEWPORT_SPEED_FACTOR; - if(self.x > 1) { - self.x = 1; + canvas.onmousedown = function(e) { + if(!self.playerController.player.isHoldingSomething()) { + self.playerController.handActionRequest(self.x, self.y); + } else { + self.swiper = new Swiper(); } - if(self.x < -1) { - self.x = -1; - }; + } - self.y -= movementY / Settings.VIEWPORT_SPEED_FACTOR; - if(self.y > 1) { - self.y = 1; + canvas.onmousemove = function(e) { + if (self.swiper) { + self.draw(e); + } else if(self.modifier) { + self.updateViewport(e); } - if(self.y < -1) { - self.y = -1; - } - - self.onXyChange(self.x, self.y); } - - canvas.onmousedown = function(e) { - var x = (((e.clientX - this.offsetLeft) / Settings.STAGE_WIDTH) * 2) - 1; - var y = (((Settings.STAGE_HEIGHT - (e.clientY - this.offsetTop)) / Settings.STAGE_HEIGHT) * 2) -1; - - self.playerController.handActionRequest(x, y); - } + canvas.onmouseup = function(e) { + if(self.swiper) { + console.log(e) + var xya = self.swiper.swipeEnd(e.x, e.y); + self.playerController.handActionRequest(xya.x, xya.y); + self.swiper = null; + } + } }; - KeyboardAndMouse.prototype.update = function(e) { - /* + KeyboardAndMouse.prototype.updateViewport = function(e) { + // -1 +1 +1 +1 xy scaling should + // -1 -1 +1 -1 be like this + var movementX = e.movementX || e.mozMovementX || e.webkitMovementX || @@ -134,10 +126,7 @@ function (Parent, KeyboardInput, DomController, Settings) { e.webkitMovementY || 0; - //console.log(movementX, movementY); - - - this.x += movementX; + this.x += movementX / Settings.VIEWPORT_SPEED_FACTOR; if(this.x > 1) { this.x = 1; } @@ -145,7 +134,7 @@ function (Parent, KeyboardInput, DomController, Settings) { this.x = -1; }; - this.y += movementY; + this.y -= movementY / Settings.VIEWPORT_SPEED_FACTOR; if(this.y > 1) { this.y = 1; } @@ -154,9 +143,32 @@ function (Parent, KeyboardInput, DomController, Settings) { } this.onXyChange(this.x, this.y); - */ + }; + + KeyboardAndMouse.prototype.draw = function(e) { + var movementX = e.movementX || + e.mozMovementX || + e.webkitMovementX || + 0; + + var movementY = e.movementY || + e.mozMovementY || + e.webkitMovementY || + 0; + + this.swiper.swipe(movementX, -movementY); + }; + + KeyboardAndMouse.prototype.activateModifier = function() { + this.modifier = true; }; + KeyboardAndMouse.prototype.deactivateModifier = function() { + this.modifier = false; + this.x = 0.3; + this.y = 0; + this.onXyChange(this.x, this.y); + }; return KeyboardAndMouse; }); \ No newline at end of file diff --git a/app/Game/Client/Control/KeyboardInput.js b/app/Game/Client/Control/KeyboardInput.js index 665d1aa..8c5484b 100755 --- a/app/Game/Client/Control/KeyboardInput.js +++ b/app/Game/Client/Control/KeyboardInput.js @@ -4,11 +4,8 @@ define([ function (Key) { - function KeyboardInput (playerController) { - - this._registry = {}; - this._playerController = playerController; - + function KeyboardInput () { + this._registry = {}; this.init(); } @@ -34,7 +31,7 @@ function (Key) { if (key && !key.getActive()) { var callback = key.getKeyDownFunction(); - if(callback) this._playerController[callback](); + if(callback) callback(); key.setActive(true); } @@ -46,7 +43,7 @@ function (Key) { var key = this._getKeyByKeyCode(e.keyCode); if (key && key.getActive()) { var callback = key.getKeyUpFunction(); - if(callback) this._playerController[callback](); + if(callback) callback(); key.setActive(false); } diff --git a/app/Game/Client/Control/PlayerController.js b/app/Game/Client/Control/PlayerController.js index 40dca1f..c31ca5c 100755 --- a/app/Game/Client/Control/PlayerController.js +++ b/app/Game/Client/Control/PlayerController.js @@ -13,9 +13,6 @@ function (Parent, Nc, KeyboardAndMouse, Gamepad) { this.keyboardAndMouse = new KeyboardAndMouse(this); this.gamepad = new Gamepad(this); - - this.ncTokens = [ - ]; } PlayerController.prototype = Object.create(Parent.prototype); @@ -23,7 +20,6 @@ function (Parent, Nc, KeyboardAndMouse, Gamepad) { PlayerController.prototype.update = function() { Parent.prototype.update.call(this); this.gamepad.update(); - this.keyboardAndMouse.update(); }; PlayerController.prototype.moveLeft = function () { @@ -93,12 +89,7 @@ function (Parent, Nc, KeyboardAndMouse, Gamepad) { PlayerController.prototype.zoomReset = function() { Nc.trigger(Nc.ns.client.game.zoomReset, false); }; - - PlayerController.prototype.destroy = function() { - Nc.offAll(this.ncTokens); - Parent.prototype.destroy.call(this); - }; - + return PlayerController; }); \ No newline at end of file diff --git a/app/Game/Client/Control/Swiper.js b/app/Game/Client/Control/Swiper.js new file mode 100644 index 0000000..9e42d28 --- /dev/null +++ b/app/Game/Client/Control/Swiper.js @@ -0,0 +1,109 @@ +define([ +], + +function () { + + var MAX_LENGTH = 300; + + function Swiper() { + this.points = []; + this.angleSum = 0; + this.lengthSum = 0; + } + + Swiper.prototype.swipe = function(x, y) { + console.log("swipe") + + if(this.lengthSum > MAX_LENGTH) return; + + this.points.push({x:x, y:y}); + var points = this.points; + + if(points.length >= 3) { + + var i = points.length - 1; + + var vectors = [ + { + x: points[i].x - points[i-1].x, + y: points[i].y - points[i-1].y + }, + { + x: points[i-2].x - points[i-1].x, + y: points[i-2].y - points[i-1].y + } + ]; + + var yx = vectors[0].y * vectors[1].x; + var xy = vectors[0].x * vectors[1].y; + var direction = 0; + if(yx > xy) { + direction = -1; + } else if (yx < xy) { + direction = 1; + } + + var dotProduct = vectors[0].x + * vectors[1].x + + vectors[0].y + * vectors[1].y; + + var currentLength = Math.sqrt( + Math.pow(vectors[0].x, 2) + + Math.pow(vectors[0].y, 2) + ); + var lastLength = Math.sqrt( + Math.pow(vectors[1].x, 2) + + Math.pow(vectors[1].y, 2) + ); + + var angle = 180 - (Math.acos((dotProduct / (currentLength * lastLength)) % 1) * 180 / Math.PI); + angle *= direction; + + if(!isNaN(parseFloat(angle)) && direction != 0) { + this.angleSum += angle; + } + + if(!isNaN(parseFloat(currentLength))) { + this.lengthSum += Math.abs(currentLength); + } + } + } + + Swiper.prototype.swipeEnd = function(x, y) { + var spin = this.angleSum; + var length = this.lengthSum; + var p0x = this.points[0].x; + var p0y = this.points[0].y; + var sumx = 0; + var sumy = 0; + + for(var i=0, count = this.points.length; i < count; i++) { + var p = this.points[i]; + sumx += p.x - p0x; + sumy += p.y - p0y; + } + + var direction = { + x: sumx / count, + y: sumy / count + }; + + var larger = Math.abs(direction.x) > Math.abs(direction.y) ? direction.x : direction.y; + direction.x /= Math.abs(larger); + direction.y /= Math.abs(larger); + + this.angleSum = 0; + this.lengthSum = 0; + this.points = []; + + return { + x: direction.x * length / 100, + y: direction.y * length / 100, + spin: spin + } + } + + return Swiper; + +}); \ No newline at end of file diff --git a/app/Game/Client/Player.js b/app/Game/Client/Player.js index b92a2ba..eed912e 100755 --- a/app/Game/Client/Player.js +++ b/app/Game/Client/Player.js @@ -102,6 +102,10 @@ function (Parent, Nc, Settings) { } }; + Player.prototype.isHoldingSomething = function() { + return !!this.holdingItem; + }; + Player.prototype.destroy = function() { clearTimeout(this.healthBarViewVisibleTimeout); Nc.trigger(Nc.ns.client.view.healthBar.remove, this.healthBarView);