package ae {
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.net.navigateToURL;
import flash.net.URLRequest;
import flash.system.Security;
import flash.system.LoaderContext;
// this class is used as the document class
// holds the bitmap, and handles all drawing commands to it
public class CircleSplit extends MovieClip
{
private static var bgb:BitmapData;
public static var bg:Bitmap;
protected var bgHolder:Sprite;
private var win:Boolean = false;
public var sp:Boolean = false;
public var picLoader:Loader;
public var pic:BitmapData = null;
public var rootNode:CircleNode;
public function CircleSplit()
{
bgb = new BitmapData(1024, 1024, false, 0x000000);
bg = new Bitmap(bgb);
bg.smoothing = true;
bgHolder = new Sprite();
addChild(bgHolder);
bgHolder.addChild(bg);
Security.allowDomain('*');
//check for a "p" parameter to the swf
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
if(paramObj["p"] != null)
{
//if we have a param, load the image
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
picLoader = new Loader();
picLoader.load( new URLRequest(paramObj["p"]), loaderContext );
picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, handlePicLoaded);
}
createCircle(1024,0,0);
}
public function handlePicLoaded(e:Event) : void
{
// once the image loads, pic will no longer will be null,
// and colors from the image will be used instead of random colors
var b:Bitmap = picLoader.content as Bitmap;
pic = b.bitmapData;
}
public function createCircle(size:Number, x:Number, y:Number) : void
{
//you can vary the width of the starting circle
var w = 1024;
var circle:Circle = new Circle(w, w, this);
circle.setColor();
//center the circle
circle.x = (1024-w) / 2;
circle.y = (1024-w) / 2;
//add it and draw it
this.addChild(circle);
drawCircle(circle);
//set up the tree root node
rootNode = new CircleNode(circle);
rootNode.xThresh = 512;
rootNode.yThresh = 512;
addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
}
public function handleMouseMove(e:MouseEvent)
{
// start a search of the quad-tree
rootNode.findTarget(e);
if(rootNode.isEmpty() && !win && sp)
{
win = true;
// do fun stuff
}
}
//draw a black rectangle where a circle used to be
public function drawSquare(c:Circle, color:int = 0x00000000)
{
var s:Sprite = new Sprite();
s.graphics.beginFill(color);
s.graphics.drawRect(0, 0, c.w, c.w)
s.graphics.endFill();
var m:Matrix = new Matrix();
m.tx = c.x; m.ty = c.y;
bg.bitmapData.draw(s, m);
}
public function copyPic(c:Circle)
{
bg.bitmapData.copyPixels(pic, new Rectangle(c.x, c.y, c.w, c.h), new Point(c.x, c.y));
}
// draw a colored circle
public function drawCircle(c:Circle)
{
var s:Sprite = new Sprite();
s.graphics.beginFill(c.c);
s.graphics.drawCircle(c.r, c.r, c.r);
//s.graphics.drawRect(0, 0, c.w, c.w)
s.graphics.endFill();
var m:Matrix = new Matrix();
m.tx = c.x; m.ty = c.y;
bg.bitmapData.draw(s, m);
}
// draw 4 circles
// adds them as children if they're above a certain size
// to allow future recursion
public function addCircles(a:Array)
{
sp = true;
var obj:Object;
var c:Circle;
if(a[0].w > 4)
{
// we still want to recurse deeper
for each(obj in a)
{
c = obj as Circle;
addChild(c);
drawCircle(c);
}
}
else
{
// don't want to recurse deeper, delete the node
// to start a chain reaction up
for each(obj in a)
{
c = obj as Circle;
c.node.deleteMe();
if(pic == null)
drawCircle(c);
else
copyPic(c);
}
}
}
}
}