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

