From 38d40fbe586ed782417cee5d6051b85e6019db7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Mon, 26 Jan 2015 01:00:00 +0100 Subject: [PATCH] Fixed ship facing angle animation (avoid a 360 turn) --- src/scripts/game/Tools.ts | 2 ++ src/scripts/view/battle/ArenaShip.ts | 2 +- src/scripts/view/common/Tools.ts | 39 ++++++++++++++++++++++++++++ src/scripts/view/specs/Tools.spec.ts | 16 ++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/scripts/view/common/Tools.ts create mode 100644 src/scripts/view/specs/Tools.spec.ts diff --git a/src/scripts/game/Tools.ts b/src/scripts/game/Tools.ts index 51f97e0..539bee5 100644 --- a/src/scripts/game/Tools.ts +++ b/src/scripts/game/Tools.ts @@ -3,6 +3,8 @@ module SpaceTac.Game { // Generic tools functions export class Tools { + + // Copy an object (only a shallow copy of immediate properties) static copyObject (object: T): T { var objectCopy = {}; diff --git a/src/scripts/view/battle/ArenaShip.ts b/src/scripts/view/battle/ArenaShip.ts index 148a2ff..aa00567 100644 --- a/src/scripts/view/battle/ArenaShip.ts +++ b/src/scripts/view/battle/ArenaShip.ts @@ -76,7 +76,7 @@ module SpaceTac.View { var tween_sprite = this.game.tweens.create(this.sprite); tween_group.to({x: x, y: y}); tween_group.start(); - tween_sprite.to({rotation: facing_angle}); + Tools.rotationTween(tween_sprite, facing_angle); tween_sprite.start(); } else { this.x = x; diff --git a/src/scripts/view/common/Tools.ts b/src/scripts/view/common/Tools.ts new file mode 100644 index 0000000..1c1a834 --- /dev/null +++ b/src/scripts/view/common/Tools.ts @@ -0,0 +1,39 @@ +module SpaceTac.View { + "use strict"; + + // Common UI tools functions + export class Tools { + + // Constraint an angle in radians the ]-pi;pi] range. + static normalizeAngle(angle: number): number { + angle = angle % (2 * Math.PI); + if (angle <= -Math.PI) { + return angle + 2 * Math.PI; + } else if (angle > Math.PI) { + return angle - 2 * Math.PI; + } else { + return angle; + } + } + + // Interpolate a rotation value + // This will take into account the 2*pi modulo + static rotationTween(tween: Phaser.Tween, dest: number, property: string = "rotation"): void { + // Immediately change the object's current rotation to be in range (-pi,pi) + var value = Tools.normalizeAngle(tween.target[property]); + tween.target[property] = value; + + // Update the tween + dest = Tools.normalizeAngle(dest); + if (value - dest > Math.PI) { + dest += 2 * Math.PI; + } else if (value - dest < -Math.PI) { + dest -= 2 * Math.PI; + } + console.log(value, dest); + var changes: Object = {}; + changes[property] = dest; + tween.to(changes); + } + } +} diff --git a/src/scripts/view/specs/Tools.spec.ts b/src/scripts/view/specs/Tools.spec.ts new file mode 100644 index 0000000..f912f92 --- /dev/null +++ b/src/scripts/view/specs/Tools.spec.ts @@ -0,0 +1,16 @@ +/// + +module SpaceTac.View.Specs { + "use strict"; + + describe("Tools", () => { + it("normalizes angles", () => { + expect(Tools.normalizeAngle(0)).toEqual(0); + expect(Tools.normalizeAngle(0.1)).toBeCloseTo(0.1, 0.000001); + expect(Tools.normalizeAngle(Math.PI)).toBeCloseTo(Math.PI, 0.000001); + expect(Tools.normalizeAngle(Math.PI + 0.5)).toBeCloseTo(-Math.PI + 0.5, 0.000001); + expect(Tools.normalizeAngle(-Math.PI)).toBeCloseTo(Math.PI, 0.000001); + expect(Tools.normalizeAngle(-Math.PI - 0.5)).toBeCloseTo(Math.PI - 0.5, 0.000001); + }); + }); +}