/** *Image from flickr.com/photos/blaster219/376777923/ */ package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.TextEvent; import flash.utils.Timer; import flash.events.TimerEvent; import flash.text.TextField; import flash.text.TextFieldType; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.geom.Matrix; import flash.display.GradientType; import flash.display.SpreadMethod; /** * ... * @author R J Morris */ public class Main extends Sprite { private var instanceOfGrid:Grid; private var theBall:Ball; public var blinker:Target; private var ticker:Timer; private var label:TextField; private var gravField:TextField; // Pattern used to check just numbers and decimal points are entered public const NUMPAT:RegExp = /[\d\.]/; // Used to record size of explosion 0 or -1 for no explosion private var bangCount:int = -1; private var overlay:Sprite; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); instanceOfGrid = new Grid(this); theBall = new Ball(this); blinker = new Target(this,395, 127); overlay = new Sprite(); overlay.x = 0; overlay.y = 0; this.addChild(overlay); //setLabel("Hello world"); configureLabel("Morph the alien gravity"); configureGravField(); gravField.text = theBall.gravity.toString(); ticker = new Timer(1000/30); ticker.addEventListener(TimerEvent.TIMER, everyFrame); ticker.start(); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point } // Main loop code. Called every fame i.e. 1 30th of a second. // Updates ball positions; checks it the target is hit by the ball // if so start expolosion // if explosion already happened increase size by one private function everyFrame(evt:TimerEvent):void { overlay.graphics.clear(); theBall.everyFrame(this); if (blinker.hit(theBall)) bang(); if (bangCount > 0) { explosion(395, 127, bangCount); ++bangCount; } } public function bang():void { trace("Bang"); bangCount = 1; } // Draws explosion centered at xCen,yCen and radius rad private function explosion(xCen:Number, yCen:Number, rad:Number):void { var fillType:String = GradientType.RADIAL; var colors:Array = [0xFF0000, 0xFFFF00]; var alphas:Array = [0.1, 0.5]; var ratios:Array = [0x00, 0xFF]; var matr:Matrix = new Matrix(); matr.createGradientBox(rad*2, rad*2, 1, xCen-rad, yCen-rad); var spreadMethod:String = SpreadMethod.REFLECT ; var i:int; overlay.graphics.beginGradientFill( fillType, colors, alphas, ratios, matr, spreadMethod,"rgb",0); overlay.graphics.drawCircle(xCen, yCen, rad); //overlay.graphics.drawRect(395-bangCount, 127-bangCount, bangCount * 2, bangCount * 2); overlay.graphics.endFill(); } public function setLabel(str:String):void { label.text = str; } // Sets up label with formatting private function configureLabel(txt:String):void { label = new TextField(); label.autoSize = TextFieldAutoSize.LEFT; label.background = false; label.border = false; var format1:TextFormat = new TextFormat(); format1.font = "Verdana"; format1.color = 0x301000; format1.size = 16; format1.underline = false; label.defaultTextFormat = format1; label.text = txt; addChild(label); } // Sets up textbox for gravity with two event listeners private function configureGravField():void { gravField = new TextField(); gravField.width = 50; gravField.x = label.textWidth+10; //gravField.autoSize = TextFieldAutoSize.LEFT; gravField.background = true; gravField.border = true; gravField.type = TextFieldType.INPUT; gravField.addEventListener(TextEvent.TEXT_INPUT, textInputHandler); //gravField.addEventListener(Event.CHANGE, changeHandler); gravField.addEventListener(KeyboardEvent.KEY_UP, keyHandler); var format:TextFormat = new TextFormat(); format.font = "Verdana"; format.color = 0x000000; format.size = 16; format.underline = false; gravField.defaultTextFormat = format; gravField.height = gravField.getLineMetrics(0).height+6; //gravField.height = format.font. addChild(gravField); } // Handles pressing return key // Checks valid number and restarts program public function keyHandler(event:KeyboardEvent):void { if (event.charCode == 13) { var val:Number = parseFloat(gravField.text); if (isNaN(val)) return; theBall.gravity = val; theBall.respawn(); bangCount = 0; } } // Handle input, ensures that only numbers and decimal point is allowed public function textInputHandler(event:TextEvent):void { if (!event.text.match(NUMPAT)) event.preventDefault(); } } }