From b6d67a05815ee01484c4665a44688c1dc88905ef Mon Sep 17 00:00:00 2001 From: Jeena Date: Sat, 14 Feb 2015 19:28:52 +0100 Subject: [PATCH] fixes #98 revisit throwing --- .../Client/Control/Inputs/KeyboardAndMouse.js | 8 +- app/Game/Client/Control/Swiper.js | 257 ++++++++++-------- app/Game/Client/View/Pixi/Layers/Swiper.js | 17 +- 3 files changed, 166 insertions(+), 116 deletions(-) diff --git a/app/Game/Client/Control/Inputs/KeyboardAndMouse.js b/app/Game/Client/Control/Inputs/KeyboardAndMouse.js index 92d0cc2..5531f8c 100644 --- a/app/Game/Client/Control/Inputs/KeyboardAndMouse.js +++ b/app/Game/Client/Control/Inputs/KeyboardAndMouse.js @@ -13,6 +13,7 @@ function (Parent, KeyboardInput, DomController, Settings, Swiper) { this.x = 0; this.y = 0; + this.mousePosition = {x:0,y:0}; this.modifier = false; this.swiper = null; this.lastLookDirection = 1; @@ -104,6 +105,8 @@ function (Parent, KeyboardInput, DomController, Settings, Swiper) { var self = this; canvas.onmousedown = function(e) { + self.mousePosition = {x:0,y:0}; + if(!self.playerController.player.isHoldingSomething()) { var options = { x: self.x, @@ -112,6 +115,7 @@ function (Parent, KeyboardInput, DomController, Settings, Swiper) { self.playerController.handActionRequest(options); } else { self.swiper = new Swiper(); + self.swiper.draw(e); } } @@ -178,7 +182,9 @@ function (Parent, KeyboardInput, DomController, Settings, Swiper) { e.webkitMovementY || 0; - this.swiper.swipe(movementX, -movementY); + this.mousePosition.x += movementX; + this.mousePosition.y += movementY; + this.swiper.swipe(this.mousePosition.x, -this.mousePosition.y); }; KeyboardAndMouse.prototype.activateModifier = function() { diff --git a/app/Game/Client/Control/Swiper.js b/app/Game/Client/Control/Swiper.js index 37eed8c..5017639 100644 --- a/app/Game/Client/Control/Swiper.js +++ b/app/Game/Client/Control/Swiper.js @@ -4,127 +4,172 @@ define([ function (Nc) { - var MAX_LENGTH = 150; + var MAX_LENGTH = 200; + var MIN_LENGTH = 5; - function Swiper() { - this.points = []; - this.angleSum = 0; - this.lengthSum = 0; - } + function Swiper() { + this.points = []; + this.angleSum = 0; + this.lengthSum = 0; + this.finished = false; + } - Swiper.prototype.swipe = function(x, y) { + Swiper.prototype.swipe = function(x, y) { - - if(this.lengthSum > MAX_LENGTH) return; - - this.points.push({x:x, y:y}); + if(this.finished) return; - Nc.trigger(Nc.ns.client.view.swiper.swipe, x, y); + var points = this.points; - 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; + // Check if swipe is long enough to count + if(points.length >= 1) { + var lastPoint = points[points.length-1]; + var a = Math.abs(x) - Math.abs(lastPoint.x); + var b = Math.abs(y) - Math.abs(lastPoint.y); + var currentLength = Math.sqrt(a * a + b * b); // Pythagoras -> hypotenuse + + if(currentLength < MIN_LENGTH) return; + } - 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) - ); + points.push({x:x, y:y}); + + if(points.length >= 2) { + + this.updateLengthSum(currentLength); - 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); - } - } - } + if(this.points.length >= 3) { + this.updateAngleSum(currentLength); + } + } - Swiper.prototype.swipeEnd = function(x, y) { - var angularVelocity = this.angleSum; - var length = this.lengthSum; + var i = points.length - 1; + Nc.trigger(Nc.ns.client.view.swiper.swipe, points[i].x, points[i].y); + } - if (this.points.length < 1) { - return { - x: 0, - y: 0, - av: 0 - } - } + Swiper.prototype.updateLengthSum = function(currentLength) { + var points = this.points; + var i = points.length - 1; - var p0x = this.points[0].x; - var p0y = this.points[0].y; - var sumx = 0; - var sumy = 0; + var lengthSum = this.lengthSum + Math.abs(currentLength); + if(lengthSum > MAX_LENGTH) { + + var diff = lengthSum - MAX_LENGTH; + var ratio = (currentLength - diff) / currentLength; - Nc.trigger(Nc.ns.client.view.swiper.end); - - 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 - }; + // Offset triangle to origin + var x0 = points[i].x - points[i-1].x; + var y0 = points[i].y - points[i-1].y; + + // Multiply with ratio and offset back + var clippedX = x0 * ratio + points[i-1].x; + var clippedY = y0 * ratio + points[i-1].y; + + points[i].x = clippedX; + points[i].y = clippedY; + + this.finished = true; + + lengthSum = MAX_LENGTH; + } + + this.lengthSum = lengthSum; + }; + + Swiper.prototype.updateAngleSum = function(currentLength) { + + var points = this.points; + var i = points.length - 1; + + // last two lines + 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 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; + } + }; + + Swiper.prototype.swipeEnd = function(x, y) { + var angularVelocity = this.angleSum; + var length = this.lengthSum; + + if (this.points.length < 1) { + return { + x: 0, + y: 0, + av: 0 + } + } + + var p0x = this.points[0].x; + var p0y = this.points[0].y; + var sumx = 0; + var sumy = 0; + + Nc.trigger(Nc.ns.client.view.swiper.end); + + 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, - av: angularVelocity / 100 - } + 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 = []; + this.finished = false; + + return { + x: direction.x * length / 100, + y: direction.y * length / 100, + av: angularVelocity / 100 + } } Swiper.prototype.destroy = function() { - for (var i = 0; i < this.ncTokens.length; i++) { - Nc.off(this.ncTokens[i]); - }; - }; + for (var i = 0; i < this.ncTokens.length; i++) { + Nc.off(this.ncTokens[i]); + }; + }; - return Swiper; + return Swiper; }); \ No newline at end of file diff --git a/app/Game/Client/View/Pixi/Layers/Swiper.js b/app/Game/Client/View/Pixi/Layers/Swiper.js index 68d5769..4421fea 100644 --- a/app/Game/Client/View/Pixi/Layers/Swiper.js +++ b/app/Game/Client/View/Pixi/Layers/Swiper.js @@ -17,11 +17,6 @@ function (Parent, PIXI, Nc, Settings) { Nc.on(Nc.ns.client.view.swiper.end, this.end, this) ]; - this.offset = { - x: Settings.STAGE_WIDTH / 2, - y: Settings.STAGE_HEIGHT / 2 - } - this.sprite = new PIXI.Graphics(); this.container.addChild(this.sprite); @@ -31,13 +26,17 @@ function (Parent, PIXI, Nc, Settings) { Swiper.prototype = Object.create(Parent.prototype); Swiper.prototype.swipe = function(x, y) { + var offset = { + x: Settings.STAGE_WIDTH / 2, + y: Settings.STAGE_HEIGHT / 2 + } - this.sprite.moveTo(this.offset.x + this.last.x, this.offset.y + this.last.y); + this.sprite.moveTo(offset.x + this.last.x, offset.y + this.last.y); - this.last.x += x; - this.last.y -= y; + this.last.x = x; + this.last.y = -y; - this.sprite.lineTo(this.offset.x + this.last.x, this.offset.y + this.last.y); + this.sprite.lineTo(offset.x + this.last.x, offset.y + this.last.y); }; Swiper.prototype.end = function(x, y) {