The Tile Engine: The Ins and Outs

squaring it all

The GameController class in the Phantom Tank game has the extra functions of ending a level, and starting a new one. In this simplified version it initializes the game and the one and only level, decides when to create a new AiTank, controls the initialization of a new life, as well as all the clearing up necessary after a death or game over. And of course, contains the game’s main loop.

The GameController Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
 
package tiletank {
 
	import flash.utils.Timer;
	import flash.utils.getTimer;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.events.MouseEvent;
 
	import tiletank.bullet.*;
	import tiletank.map.*;
	import tiletank.tank.*;
 
 
	public class GameController {
 
		private static var _instance:GameController;
 
		private var _gameElements:StageElements;
		private var _gameData:GameData;
		private var _screenManager:ScreenManager;
 
		private var _maze:Maze;
		private var _tank:PlayerTank;
 
		private var _gameStage:GameStage;
 
		private var _initTimer:Timer;
		private var _death:Timer;
		private var _newLife:Timer;
 
		function GameController (instantiator:Instantiator) {}
 
 
 
		public static function get instance():GameController {
            if(GameController._instance == null) {
           		GameController._instance= new GameController (new Instantiator());
				GameController._instance.initInstance();
			 }
            return GameController._instance;
        }
 
		private function initInstance ():void {
			_gameElements = StageElements.instance;
			_gameData = GameData.instance;
			_screenManager = ScreenManager.instance;
		}
 
		public function initController ():void {
			_gameData.gameMode = GameConstants.PAUSE;
 
			//timer between dying and cleaning up stage for new life
			_death = new Timer (GameConstants.TIME_AFTER_DEATH, 1);
			//timer between resetting stage and starting new life
			_newLife = new Timer(GameConstants.TIME_NEW_LIFE, 1);
 
			_death.addEventListener(TimerEvent.TIMER_COMPLETE, onDeath, false, 0, true);
			_newLife.addEventListener(TimerEvent.TIMER_COMPLETE, onNewLife, false, 0, true);
 
			_gameStage = _gameElements.getElementByClass(GameConstants.GAME_STAGE) as GameStage;
 
			_initTimer = new Timer (GameConstants.TIME_INIT_GAME, 4);
			_initTimer.addEventListener(TimerEvent.TIMER, createAi, false, 0, true);
			_gameStage.addEventListener (Event.ENTER_FRAME, gameLoop, false, 0, true);
			initLevel();
 
		}
 
		public function initLevel ():void {
			_gameStage.showInitStage();
			var scores:GameInfo = _gameElements.getElementByClass(GameConstants.SCORES) as GameInfo;
			scores.lives = String(_gameData.lives);
			//game starts on mouse click
			_gameStage.addEventListener (MouseEvent.MOUSE_UP, onStageMouseUp, false, 0, true);
 
			//initGame();
		}
 
		public function initGame ():void {
			_gameStage.showGameStage();
			_initTimer.reset();
			_initTimer.start();
			_tank = _gameElements.getElementByClass(GameConstants.PLAYER_TANK) as PlayerTank;
			createAi();
		}
 
		public function startNewLife ():void {
			if (_initTimer.running) _initTimer.stop();
			_death.reset();
			_death.start();
 
		}
 
		public function restart ():void {
			if (_initTimer.running) _initTimer.stop();
			_gameData.reset();
 
			var scores:GameInfo = _gameElements.getElementByClass(GameConstants.SCORES) as GameInfo;
			scores.lives = String(_gameData.lives);
 
			_newLife.reset();
			_newLife.start();
 
			_gameStage.showInitStage();
		}
 
		public function gameOver ():void {
			_gameData.gameMode = GameConstants.PAUSE;
			_gameStage._bg.gotoAndPlay("hit");
			_gameStage.showGameOver();
		}
 
		private var _timeNow:uint;
		private var _timeThen:uint = 0;
 
		/**
		* Main loop
		*/
		private function gameLoop (event:Event):void {
			if (_gameData.gameMode == GameConstants.PAUSE) return;
			_timeNow = getTimer();
			if (_timeNow - _timeThen < 32) return;
			_timeThen = _timeNow;
			_screenManager.updateScreen();
 
		}
 
		private function createAi (event:TimerEvent = null):void {
			if (_gameData.gameMode == GameConstants.PAUSE) return;
			_gameStage.addAi();
		}
 
		private function onDeath (event:TimerEvent):void {
 
			_gameData.enemiesCreated = _gameData.enemiesDestroyed;
 
			//show life
			var scores:GameInfo = _gameElements.getElementByClass(GameConstants.SCORES) as GameInfo;
			scores.lives = String(_gameData.lives);
 
			_newLife.reset();
			_newLife.start();
 
			_gameStage.showInitStage();
		}
		private function onNewLife (event:TimerEvent):void {
			initGame();
		}
		private function onStageMouseUp (event:MouseEvent):void {
			_gameStage.removeEventListener (MouseEvent.MOUSE_UP, onStageMouseUp);
			initGame();
 
		}
	}
}
 
internal class Instantiator {}

Leave a Comment