Skip to content

Commit

Permalink
add PlayerTankFactory, PlayerTankControllerFactory
Browse files Browse the repository at this point in the history
  • Loading branch information
newagebegins committed Jun 17, 2012
1 parent 183d5bd commit fd05261
Show file tree
Hide file tree
Showing 11 changed files with 144 additions and 15 deletions.
2 changes: 2 additions & 0 deletions BattleCity.html
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
<script type="text/javascript" src="src/TankExplosion.js"></script>
<script type="text/javascript" src="src/PointsFactory.js"></script>
<script type="text/javascript" src="src/Points.js"></script>
<script type="text/javascript" src="src/PlayerTankFactory.js"></script>
<script type="text/javascript" src="src/PlayerTankControllerFactory.js"></script>

<script type="text/javascript" src="lib/Stats.js"></script>
<script type="text/javascript" src="src/FPSCounter.js"></script>
Expand Down
4 changes: 4 additions & 0 deletions SpecRunner.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
<script type="text/javascript" src="spec/TankExplosionSpec.js"></script>
<script type="text/javascript" src="spec/PointsFactorySpec.js"></script>
<script type="text/javascript" src="spec/PointsSpec.js"></script>
<script type="text/javascript" src="spec/PlayerTankFactorySpec.js"></script>
<script type="text/javascript" src="spec/PlayerTankControllerFactorySpec.js"></script>

<!-- source files -->
<script type="text/javascript" src="src/Utils.js"></script>
Expand Down Expand Up @@ -94,6 +96,8 @@
<script type="text/javascript" src="src/TankExplosion.js"></script>
<script type="text/javascript" src="src/PointsFactory.js"></script>
<script type="text/javascript" src="src/Points.js"></script>
<script type="text/javascript" src="src/PlayerTankFactory.js"></script>
<script type="text/javascript" src="src/PlayerTankControllerFactory.js"></script>

<script type="text/javascript">
(function() {
Expand Down
5 changes: 3 additions & 2 deletions spec/AITankControllerFactorySpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ describe("AITankControllerFactory", function () {
var eventManager = new EventManager();
spyOn(eventManager, 'addSubscriber');
var factory = new AITankControllerFactory(eventManager);
expect(eventManager.addSubscriber).toHaveBeenCalledWith(factory, [Tank.Event.CREATED]);
expect(eventManager.addSubscriber).toHaveBeenCalledWith(factory, [EnemyFactory.Event.ENEMY_CREATED]);
});

describe("#notify", function () {
it("Tank.Event.CREATED", function () {
it("EnemyFactory.Event.ENEMY_CREATED", function () {
var eventManager = new EventManager();
var factory = new AITankControllerFactory(eventManager);
spyOn(factory, 'createController');
var tank = new Tank(eventManager);
factory.notify({'name': EnemyFactory.Event.ENEMY_CREATED, 'enemy': tank});
expect(factory.createController).toHaveBeenCalledWith(tank);
});
});
Expand Down
3 changes: 3 additions & 0 deletions spec/EnemyFactorySpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ describe("EnemyFactory", function () {

it("#createEnemy", function () {
var eventManager = new EventManager();
spyOn(eventManager, 'fireEvent');
var factory = new EnemyFactory(eventManager);
var enemy = {type: Tank.Type.BASIC};
var position = new Point(1, 2);
Expand All @@ -147,6 +148,8 @@ describe("EnemyFactory", function () {
expect(tank.getPosition()).toEqual(position);
expect(tank.getState() instanceof TankStateAppearing).toBeTruthy();
expect(tank.isPlayer()).toBeFalsy();

expect(eventManager.fireEvent).toHaveBeenCalledWith({'name': EnemyFactory.Event.ENEMY_CREATED, 'enemy': tank});
});

describe("#notify", function () {
Expand Down
27 changes: 27 additions & 0 deletions spec/PlayerTankControllerFactorySpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
describe("PlayerTankControllerFactory", function () {
it("should subscribe", function () {
var eventManager = new EventManager();
spyOn(eventManager, 'addSubscriber');
var factory = new PlayerTankControllerFactory(eventManager);
expect(eventManager.addSubscriber).toHaveBeenCalledWith(factory, [PlayerTankFactory.Event.PLAYER_TANK_CREATED]);
});

describe("#notify", function () {
it("PlayerTankFactory.Event.PLAYER_TANK_CREATED", function () {
var eventManager = new EventManager();
var factory = new PlayerTankControllerFactory(eventManager);
spyOn(factory, 'create');
var tank = new Tank(eventManager);
factory.notify({'name': PlayerTankFactory.Event.PLAYER_TANK_CREATED, 'tank': tank});
expect(factory.create).toHaveBeenCalledWith(tank);
});
});

it("#create", function () {
var eventManager = new EventManager();
var factory = new PlayerTankControllerFactory(eventManager);
var tank = new Tank(eventManager);
var controller = factory.create(tank);
expect(controller instanceof TankController).toBeTruthy();
});
});
35 changes: 35 additions & 0 deletions spec/PlayerTankFactorySpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
describe("PlayerTankFactory", function () {
it("should subscribe", function () {
var eventManager = new EventManager();
spyOn(eventManager, 'addSubscriber');
var factory = new PlayerTankFactory(eventManager);
expect(eventManager.addSubscriber).toHaveBeenCalledWith(factory, [TankExplosion.Event.DESTROYED]);
});

describe("#notify", function () {
it("TankExplosion.Event.DESTROYED", function () {
var eventManager = new EventManager();
var factory = new PlayerTankFactory(eventManager);
spyOn(factory, 'create');
var tank = new Tank(eventManager);
var explosion = new TankExplosion(eventManager, tank);
factory.notify({'name': TankExplosion.Event.DESTROYED, 'explosion': explosion});
expect(factory.create).toHaveBeenCalled();
});
});

it("#create", function () {
var eventManager = new EventManager();
spyOn(eventManager, 'fireEvent');
var factory = new PlayerTankFactory(eventManager);
factory.setAppearPosition(new Point(1,2));

var tank = new Tank(eventManager);
tank.setPosition(new Point(1,2));
tank.setState(new TankStateAppearing(tank));

var product = factory.create();
expect(product).toEqual(tank);
expect(eventManager.fireEvent).toHaveBeenCalledWith({'name': PlayerTankFactory.Event.PLAYER_TANK_CREATED, 'tank': tank});
});
});
14 changes: 7 additions & 7 deletions src/AITankControllerFactory.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
function AITankControllerFactory(eventManager) {
this._eventManager = eventManager;
this._eventManager.addSubscriber(this, [Tank.Event.CREATED]);
this._eventManager.addSubscriber(this, [EnemyFactory.Event.ENEMY_CREATED]);
}

AITankControllerFactory.prototype.createController = function (tank) {
return new AITankController(tank, new Random());
};

AITankControllerFactory.prototype.notify = function (event) {
if (event.name == Tank.Event.CREATED) {
this.createController(event.tank);
if (event.name == EnemyFactory.Event.ENEMY_CREATED) {
this.createController(event.enemy);
}
};

AITankControllerFactory.prototype.createController = function (tank) {
return new AITankController(tank, new Random());
};
4 changes: 4 additions & 0 deletions src/EnemyFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ function EnemyFactory(eventManager) {
this._enemyCountLimit = 4;
}

EnemyFactory.Event = {};
EnemyFactory.Event.ENEMY_CREATED = 'EnemyFactory.Event.ENEMY_CREATED';

EnemyFactory.prototype.setEnemies = function (enemies) {
this._enemies = enemies;
};
Expand Down Expand Up @@ -62,6 +65,7 @@ EnemyFactory.prototype.createEnemy = function (enemy, position) {
tank.setPosition(position);
tank.setState(new TankStateAppearing(tank));

this._eventManager.fireEvent({'name': EnemyFactory.Event.ENEMY_CREATED, 'enemy': tank});
this._enemyCount++;

return tank;
Expand Down
13 changes: 7 additions & 6 deletions src/Level.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions src/PlayerTankControllerFactory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
function PlayerTankControllerFactory(eventManager) {
this._eventManager = eventManager;
this._eventManager.addSubscriber(this, [PlayerTankFactory.Event.PLAYER_TANK_CREATED]);
}

PlayerTankControllerFactory.prototype.notify = function (event) {
if (event.name == PlayerTankFactory.Event.PLAYER_TANK_CREATED) {
this.create(event.tank);
}
};

PlayerTankControllerFactory.prototype.create = function (tank) {
var controller = new TankController(this._eventManager, tank);
return controller;
};
37 changes: 37 additions & 0 deletions src/PlayerTankFactory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
function PlayerTankFactory(eventManager) {
this._eventManager = eventManager;
this._eventManager.addSubscriber(this, [TankExplosion.Event.DESTROYED]);
this._appearPosition = new Point(0, 0);
}

PlayerTankFactory.Event = {};
PlayerTankFactory.Event.PLAYER_TANK_CREATED = 'PlayerTankFactory.Event.PLAYER_TANK_CREATED';

PlayerTankFactory.prototype.notify = function (event) {
if (this._tankExplosionDestroyed(event)) {
this.create();
}
};

PlayerTankFactory.prototype.setAppearPosition = function (position) {
this._appearPosition = position;
};

PlayerTankFactory.prototype.create = function () {
var tank = new Tank(this._eventManager);
tank.setPosition(this._appearPosition);
tank.setState(new TankStateAppearing(tank));
this._eventManager.fireEvent({'name': PlayerTankFactory.Event.PLAYER_TANK_CREATED, 'tank': tank});
return tank;
};

PlayerTankFactory.prototype._tankExplosionDestroyed = function (event) {
if (event.name != TankExplosion.Event.DESTROYED) {
return false;
}
var tank = event.explosion.getTank();
if (!tank.isPlayer()) {
return false;
}
return true;
};

0 comments on commit fd05261

Please sign in to comment.