package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.KeyboardEvent; import flash.utils.getTimer; import flash.utils.Timer; [SWF(width=1280, height=720, frameRate=60)] public class Main extends Sprite { public static const UPDATE_INTERVAL:Number = 1 / 60; private var level:LevelModel; private var view:GameplayView; private var gameStateController:GameStateController; private var gameStateModel:GameStateModel; private var lastTime:Number = 0; private var slop:Number = 0; private var lastDrawTime:Number = 0; private var moveWestKeyDown:Boolean, moveEastKeyDown:Boolean, moveNorthKeyDown:Boolean, moveSouthKeyDown:Boolean; private var moveX:int, moveY:int; private var velocity:Vector2; private var playerInputController:PlayerInputController; public function Main() { var player:PlayerModel; var coworker:WorkerModel; var nextWorkerID:int = 1; var coworkerIndexWithSandwich:int; stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.color = 0xACC7FF; level = new LevelModel(); gameStateModel = new GameStateModel(level); gameStateController = new GameStateController(gameStateModel); player = new PlayerModel(Math.random() < 0.5 ? Gender.MALE : Gender.FEMALE); player.facing = level.playerStartFacing; player.position.x = level.playerStartPosition.x; player.position.z = level.playerStartPosition.z; gameStateModel.addObject(player); gameStateController.addObjectController(new PlayerController(player, gameStateModel)); coworkerIndexWithSandwich = Math.random() * level.coworkers.length; for each (var coworkerSpec:Object in level.coworkers) { coworker = new WorkerModel(coworkerSpec.gender, nextWorkerID++); coworker.facing = coworkerSpec.facing; coworker.position.x = coworkerSpec.position.x; coworker.position.z = coworkerSpec.position.z; if (coworkerIndexWithSandwich == 0) { coworker.hasSandwich = true; } coworkerIndexWithSandwich--; gameStateModel.addObject(coworker); gameStateController.addObjectController(new WorkerAIController(coworker, gameStateModel)); } playerInputController = new PlayerInputController(player); view = new GameplayView(gameStateModel, player); addChild(view); view.draw(0); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(Event.RENDER, onRender); } private function onEnterFrame(event:Event):void { var currentTime:Number, elapsedTime:Number; currentTime = getTimer() / 1000; elapsedTime = currentTime - lastTime + slop; while (elapsedTime >= UPDATE_INTERVAL) { gameStateController.update(); elapsedTime -= UPDATE_INTERVAL; } slop = elapsedTime; lastTime = currentTime; stage.invalidate(); } private function onRender(event:Event):void { var currentTime:Number; currentTime = getTimer() / 1000; view.draw(currentTime - lastDrawTime); lastDrawTime = currentTime; } private function onKeyDown(event:KeyboardEvent):void { playerInputController.keyDown(event.keyCode); } private function onKeyUp(event:KeyboardEvent):void { playerInputController.keyUp(event.keyCode); } } }