From 36b54e7b7522060da1eb96610cd302512a5247fb 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 --- src/scripts/game/Ship.ts | 2 ++ src/scripts/game/events/MoveEvent.ts | 5 +++++ src/scripts/game/specs/Ship.spec.ts | 27 +++++++++++++++++++++++++ src/scripts/view/battle/ArenaShip.ts | 7 +++---- src/scripts/view/battle/LogProcessor.ts | 5 +++-- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/scripts/game/Ship.ts b/src/scripts/game/Ship.ts index fe3ceae..eec18fc 100644 --- a/src/scripts/game/Ship.ts +++ b/src/scripts/game/Ship.ts @@ -204,8 +204,10 @@ module SpaceTac.Game { var dy = dest[1] - this.arena_y; var distance = Math.sqrt(dx * dx + dy * dy); var cost = distance * this.movement_cost; + var angle = Math.atan2(y - this.arena_y, x - this.arena_x); this.setArenaPosition(this.arena_x + dx, this.arena_y + dy); + this.setArenaFacingAngle(angle); this.useActionPoints(cost); } diff --git a/src/scripts/game/events/MoveEvent.ts b/src/scripts/game/events/MoveEvent.ts index 0285d47..3a7d0fa 100644 --- a/src/scripts/game/events/MoveEvent.ts +++ b/src/scripts/game/events/MoveEvent.ts @@ -3,8 +3,13 @@ module SpaceTac.Game { // Event logged when a ship moves export class MoveEvent extends BaseLogEvent { + // New facing angle, in radians + facing_angle: number; + constructor(ship: Ship, x: number, y: number) { super("move", ship, Target.newFromLocation(x, y)); + + this.facing_angle = ship.arena_angle; } } } diff --git a/src/scripts/game/specs/Ship.spec.ts b/src/scripts/game/specs/Ship.spec.ts index 101586a..698c46b 100644 --- a/src/scripts/game/specs/Ship.spec.ts +++ b/src/scripts/game/specs/Ship.spec.ts @@ -37,6 +37,33 @@ module SpaceTac.Game { expect(ship.arena_y).toEqual(50); }); + it("computes facing angle", function () { + var ship = new Ship(null, "Test"); + ship.ap_current.setMaximal(20); + ship.ap_current.set(20); + ship.movement_cost = 3; + ship.arena_angle = 0; + ship.setArenaPosition(50, 50); + + ship.moveTo(50, 50); + expect(ship.arena_angle).toEqual(0); + + ship.moveTo(51, 51); + expect(ship.arena_angle).toBeCloseTo(0.785398, 0.00001); + + ship.moveTo(51, 52); + expect(ship.arena_angle).toBeCloseTo(1.5707963, 0.00001); + + ship.moveTo(52, 52); + expect(ship.arena_angle).toEqual(0); + + ship.moveTo(52, 50); + expect(ship.arena_angle).toBeCloseTo(-1.5707963, 0.00001); + + ship.moveTo(50, 50); + expect(ship.arena_angle).toBeCloseTo(3.14159265, 0.00001); + }); + it("lists available actions from attached equipment", function () { var ship = new Ship(null, "Test"); var actions: BaseAction[]; diff --git a/src/scripts/view/battle/ArenaShip.ts b/src/scripts/view/battle/ArenaShip.ts index d3000d0..148a2ff 100644 --- a/src/scripts/view/battle/ArenaShip.ts +++ b/src/scripts/view/battle/ArenaShip.ts @@ -70,19 +70,18 @@ module SpaceTac.View { } // Move the sprite to a location - moveTo(x: number, y: number, animate: boolean = true) { - var angle = Math.atan2(y - this.y, x - this.x); + moveTo(x: number, y: number, facing_angle: number, animate: boolean = true) { if (animate) { var tween_group = this.game.tweens.create(this); var tween_sprite = this.game.tweens.create(this.sprite); tween_group.to({x: x, y: y}); tween_group.start(); - tween_sprite.to({rotation: angle}); + tween_sprite.to({rotation: facing_angle}); tween_sprite.start(); } else { this.x = x; this.y = y; - this.sprite.rotation = angle; + this.sprite.rotation = facing_angle; } } } diff --git a/src/scripts/view/battle/LogProcessor.ts b/src/scripts/view/battle/LogProcessor.ts index fb34104..b795563 100644 --- a/src/scripts/view/battle/LogProcessor.ts +++ b/src/scripts/view/battle/LogProcessor.ts @@ -40,9 +40,10 @@ module SpaceTac.View { this.view.action_bar.setShip(event.target.ship); break; case "move": - var sprite = this.view.arena.findShipSprite(event.ship); + var move_event: Game.MoveEvent = event; + var sprite = this.view.arena.findShipSprite(move_event.ship); if (sprite) { - sprite.moveTo(event.target.x, event.target.y); + sprite.moveTo(move_event.target.x, move_event.target.y, move_event.facing_angle, true); } break; }