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 {} |
This Post contains multiple pages:
Pages: 1 2 3 4 5 6 7 8 9 10 11

