package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.TimerEvent; import flash.utils.Timer; import flash.display.Sprite; import flash.filters.BitmapFilterQuality; import flash.filters.GlowFilter; import flash.display.JointStyle; import flash.display.CapsStyle; import flash.display.LineScaleMode; import flash.geom.Point; /** * @author thijs.broerse */ public class LightningController extends Sprite { public static const COLOR : Number = 0x00FF00; public static const STAGE_WIDTH : Number = 550; public static const STAGE_HEIGHT : Number = 400; public static const CIRCLE_RADIUS : Number = 190; private static const LIGHTNING_DELAY : Number = 100; private static const THINKNESS : Number = 1; private static const DISPLACE : Number = 150; private static const DETAIL : Number = 10; private var mContainer : Sprite; private var mTimer : Timer; private const mCenterPoint : Point = new Point(STAGE_WIDTH*.5,STAGE_HEIGHT * .5); private var mBitmap : BitmapData; public function LightningController() { // draw black background graphics.beginFill(0x000000); graphics.drawRect(0, 0, STAGE_WIDTH, STAGE_HEIGHT); graphics.endFill(); // bitmap for screenshots mBitmap = new BitmapData(STAGE_WIDTH, STAGE_HEIGHT, true, 0x000000); var bmp : Bitmap = new Bitmap(mBitmap); bmp.alpha = .5; addChild(bmp); // draw circel var circleClip:Sprite = new Sprite(); circleClip.graphics.lineStyle(1,COLOR,1); circleClip.graphics.beginFill(0x000000); circleClip.graphics.drawCircle((STAGE_WIDTH)*.5, (STAGE_HEIGHT)*.5, CIRCLE_RADIUS); var circleglow : GlowFilter = new GlowFilter(); circleglow.color = COLOR; circleglow.alpha = .5; circleglow.blurX = 50; circleglow.blurY = 50; circleglow.quality = BitmapFilterQuality.LOW; circleglow.strength = 2; circleglow.inner = true; circleglow.knockout = true; circleClip.filters = [circleglow]; addChild(circleClip); mContainer = new Sprite(); var glow : GlowFilter = new GlowFilter(); glow.color = COLOR; glow.alpha = 1; glow.blurX = 8; glow.blurY = 8; glow.quality = BitmapFilterQuality.LOW; glow.strength = 6; mContainer.filters = [glow]; addChild(mContainer); // draw circel mask var circleMask:Sprite = new Sprite(); circleMask.graphics.lineStyle(1,0xFFFFFF,1); circleMask.graphics.beginFill(0x000000); circleMask.graphics.drawCircle((STAGE_WIDTH)*.5, (STAGE_HEIGHT)*.5, CIRCLE_RADIUS); mContainer.mask = circleMask; drawLightning(getRandomPointOnCircle(mCenterPoint), mCenterPoint,DISPLACE, THINKNESS); mTimer = new Timer(LIGHTNING_DELAY); mTimer.addEventListener(TimerEvent.TIMER, redrawLightning); mTimer.start(); } private function redrawLightning(event : TimerEvent) : void { mBitmap.draw(this); mContainer.graphics.clear(); drawLightning(getRandomPointOnCircle(new Point(mouseX, mouseY)), mCenterPoint,DISPLACE, THINKNESS); drawLightning(getRandomPointOnCircle(new Point(mouseX, mouseY)), mCenterPoint,DISPLACE, THINKNESS); // drawLightning(getRandomPointOnCircle(mCenterPoint), mCenterPoint,DISPLACE, THINKNESS); // drawLightning(getRandomPointOnCircle(mCenterPoint), mCenterPoint,DISPLACE, THINKNESS); } private function drawLightning(inFromPoint : Point, inToPoint : Point, inDisplace : Number, inThickness : Number) : void { if(inFromPoint == null || inToPoint == null) return; if(inThickness < .1 ) return; if(Point.distance(inFromPoint, inToPoint) <= DETAIL) { mContainer.graphics.lineStyle(inThickness, 0xFFFFFF, inThickness/THINKNESS, true, LineScaleMode.NORMAL, CapsStyle.NONE, JointStyle.MITER, 10); mContainer.graphics.moveTo(inFromPoint.x, inFromPoint.y); mContainer.graphics.lineTo(inToPoint.x, inToPoint.y); } else { var midPoint : Point = new Point((inFromPoint.x+inToPoint.x)*.5+(inDisplace * Math.random())-.5*inDisplace, (inFromPoint.y+inToPoint.y)*.5+inDisplace * Math.random()-.5*inDisplace); drawLightning(inFromPoint, midPoint,inDisplace*.5,inThickness); drawLightning(midPoint,inToPoint,inDisplace*.5,inThickness); if(Math.random() > .95 ){ drawLightning(midPoint, getRandomPointOnCircle(midPoint),inDisplace,inThickness * .5); } } } private function getRandomPointOnCircle(inOffsetPoint : Point) : Point { var radian : Number = Math.random() * 2 * Math.PI; var circlePoint : Point = new Point(Math.cos(radian) * CIRCLE_RADIUS + STAGE_WIDTH *.5, Math.sin(radian) * CIRCLE_RADIUS + STAGE_HEIGHT *.5); var distance : Number = Point.distance(mCenterPoint, inOffsetPoint); if(distance > CIRCLE_RADIUS) return null; if(Point.distance(circlePoint, inOffsetPoint) > (1.05 * CIRCLE_RADIUS - distance)) { circlePoint = getRandomPointOnCircle(inOffsetPoint); } return circlePoint; } } }