package { import flash.display.Bitmap; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Rectangle; import flash.text.TextField; import flash.text.TextFormat; import flash.utils.getTimer; [SWF(width="320", height="460", frameRate="60", backgroundColor="#FFFFFF")] public class MobileFlashGamingTest extends Sprite { [Embed(source="/assets/groundtile.png")] private var BackgroundTile:Class; [Embed(source="/assets/monster/s1.png")] private var EnemySouth1:Class; [Embed(source="/assets/monster/s2.png")] private var EnemySouth2:Class; [Embed(source="/assets/monster/s3.png")] private var EnemySouth3:Class; [Embed(source="/assets/monster/e1.png")] private var EnemyEast1:Class; [Embed(source="/assets/monster/e2.png")] private var EnemyEast2:Class; [Embed(source="/assets/monster/e3.png")] private var EnemyEast3:Class; [Embed(source="/assets/monster/w1.png")] private var EnemyWest1:Class; [Embed(source="/assets/monster/w2.png")] private var EnemyWest2:Class; [Embed(source="/assets/monster/w3.png")] private var EnemyWest3:Class; [Embed(source="/assets/monster/n1.png")] private var EnemyNorth1:Class; [Embed(source="/assets/monster/n2.png")] private var EnemyNorth2:Class; [Embed(source="/assets/monster/n3.png")] private var EnemyNorth3:Class; public function MobileFlashGamingTest(){ stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; createChildren(); init(); } private var fps:TextField; private var results:TextField; private var draw:Sprite; private var meter:FPSMeter; private var monsters:Array = []; private function init():void{ var eastWalk:Array = [new EnemyEast1(), new EnemyEast2(), new EnemyEast3(), new EnemyEast2()]; var southWalk:Array = [new EnemySouth1(), new EnemySouth2(), new EnemySouth3(), new EnemySouth2()]; var westWalk:Array = [new EnemyWest1(), new EnemyWest2(), new EnemyWest3(), new EnemyWest2()]; var northWalk:Array = [new EnemyNorth1(), new EnemyNorth2(), new EnemyNorth3(), new EnemyNorth2()]; var R:Number = Math.PI/180; for(var i:int=0; i<20; i++){ var speed:Number = 3+(Math.random()*2); var angle:Number = Math.random()*360; var fb:FramedBitmap; if(angle >= 45 && angle < 135){ fb = new FramedBitmap(southWalk); }else if(angle >= 135 && angle < 225){ fb = new FramedBitmap(westWalk); }else if(angle >= 225 && angle < 315){ fb = new FramedBitmap(northWalk); }else{ fb = new FramedBitmap(eastWalk); } fb.x = Math.random()*1200; fb.y = Math.random()*600; fb.xMove = Math.cos(angle*R)*speed; fb.yMove = Math.sin(angle*R)*speed; fb.scaleX = fb.scaleY = 0.5+(Math.random()*0.7); fb.randomize(); monsters.push(fb); draw.addChild(fb); } meter = new FPSMeter(); addEventListener(Event.ENTER_FRAME, processFrame); draw.graphics.beginBitmapFill(new BackgroundTile().bitmapData); draw.graphics.drawRect(0,0,320,440); } private function processFrame(evt:Event):void { for(var i:int=0; i 320){ fb.x -= 360; } if(fb.y < -40){ fb.y += 480; }else if(fb.y > 440){ fb.y -= 480; } fb.increment(); } updatePerformance(); } protected function updatePerformance():void { meter.increment(); fps.text = meter.getFramerate()+" fps"; if(testRunning){ continueTest(); } } private var testBegin:int = 0; private var testData:Array = []; private var testRunning:Boolean = false; private function startTest(evt:MouseEvent):void{ testBegin = getTimer(); testRunning = true; testData = []; results.text = "Running..." } private function continueTest():void{ var time:uint = getTimer(); testData.push(time); if(time-testBegin > 10000){ testRunning = false; var output:Number = testData.length/(time-testBegin)*1000; results.text = "Test: "+FPSMeter.formatNumber(output)+" fps"; } } private function createChildren():void { var header:Sprite = new Sprite(); header.graphics.beginFill(0xC0C4DF); header.graphics.drawRect(0,0,320,20); addChild(header); var title:TextField = createTextField("GUIMark"); title.width = 300; title.x = 2; header.addChild(title); var button:Sprite = createButton(); button.x = 60; button.y = 1; button.addEventListener(MouseEvent.CLICK, startTest); header.addChild(button); fps = createTextField(""); fps.width = 130; fps.x = 150; header.addChild(fps); results = createTextField(""); results.width = 300; results.x = 220; header.addChild(results); draw = new Sprite(); draw.x = 0; draw.y = 20; draw.scrollRect = new Rectangle(0, 0, 320, 440); addChild(draw); } private function createTextField(val:String):TextField { var txt:TextField = new TextField(); txt.y = 2; txt.defaultTextFormat = new TextFormat("Arial", 12, 0x000000, true); txt.text = val; return txt; } private function createButton():Sprite { var buttonText:TextField = new TextField(); buttonText.x = 7; buttonText.y = 1; buttonText.width = 63; buttonText.height = 18; buttonText.defaultTextFormat = new TextFormat("Arial", 12, 0x000000); buttonText.text = "Start Test"; buttonText.mouseEnabled = false; var button:Sprite = new Sprite(); button.graphics.beginFill(0xDDDDDD); button.graphics.lineStyle(2, 0x999999); button.graphics.drawRoundRect(0,0,70,18,15); button.buttonMode = true; button.addChild(buttonText); return button; } } } import flash.display.Bitmap; import flash.utils.getTimer; class FramedBitmap extends Bitmap { private var bitmaps:Array; public var frame:uint = 0; public var xMove:Number; public var yMove:Number; public function FramedBitmap(source:Array){ bitmaps = source; smoothing = true; } public function increment():void{ if(++frame >= bitmaps.length){ frame = 0; } bitmapData = this.bitmaps[frame].bitmapData; } public function randomize():void{ frame = Math.floor(Math.random()*bitmaps.length); bitmapData = this.bitmaps[frame].bitmapData; } } class FPSMeter { private var sampleFPS:Number = 0; private var lastSampledTime:uint = 0; private var sampleFrames:Number = 0; public var sampleDuration:uint = 500; public function increment():void { sampleFrames++; } public function getFramerate():Number { var diff:uint = getTimer()-lastSampledTime; if(diff >= sampleDuration){ var rawFPS:Number = sampleFrames/(diff/1000); sampleFPS = FPSMeter.formatNumber(rawFPS); sampleFrames = 0; lastSampledTime = getTimer(); } return sampleFPS; } public static function formatNumber(val:Number):Number{ //format as XX.XX return Math.floor(val*100)/100; } }