Tile Engine: Game Controller

loopa loopa

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


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 {}