[SWF(width = 800, height = 600)]
var circle:Shape = new Shape();
var radius:Number = 4;
var diameter:Number = radius * 2;
var diam4:Number = diameter * 4;
with(circle.graphics) beginFill(0x000000), drawCircle(diameter,diameter,radius);
circle.filters = [new BlurFilter(5, 5, 2)];
var currFrame:Frame;
// populate the linked list
generateAnimation();
var animationNum:int = 8000;
var animation:Vector.<Frame> = new Vector.<Frame>();
var locs:Vector.<Point> = new Vector.<Point>();
// populate locs and animation
while(animation.length < animationNum){
currFrame = currFrame.next;
animation.push(currFrame);
locs.push(new Point(Math.random() * stage.stageWidth - radius,
Math.random() * (stage.stageHeight+diam4) - diam4));
}
var rect:Rectangle = animation[0].bitmap.rect;
var bottom:Number = stage.stageHeight + rect.height;
var top:Number = -rect.height;
var canvas:BitmapData = new
BitmapData(stage.stageWidth,stage.stageHeight,false, 0x000000);
addChild(new Bitmap(canvas));
addEventListener(Event.ENTER_FRAME, onLoop);
function onLoop(evt:Event):void {
// clear the canvas
canvas.fillRect(canvas.rect, 0x222222);
// draw the current frame
for (var i:int = 0; i<animationNum; i++){
var ani:Frame = animation[i];
var pnt:Point = locs[i];
canvas.copyPixels(ani.bitmap, rect, pnt, null, null, true);
// get the next frame of the animation
pnt.y += 1;
if (pnt.y > bottom){
pnt.y = top;
}
animation[i] = ani.next;
}
}
// generate and capture 40 bitmaps by altering the colorTransform of
function generateAnimation():void{
var channel:uint = 0;
var ct:ColorTransform = new ColorTransform();
var increase:Boolean = true;
var firstFrame:Frame;
var pFrame:Frame;
for (var i:int = 0; i<40; i++){
if (increase){
channel += 10.25;
if (channel > 200){
increase = false;
}
}else{
channel -= 10;
}
ct.color = channel << 16 | channel << 8 | channel;
circle.transform.colorTransform = ct;
// populate linked list
currFrame = capture(circle);
if (pFrame){
pFrame.next = currFrame;
}
if (i == 0){
firstFrame = currFrame;
}
pFrame = currFrame;
}
// close the list
currFrame.next = firstFrame;
currFrame = firstFrame;
}
// create the Frame instance and draw the circle to it
// preserving the colorTransform information
function capture(target:Shape):Frame{
var frame:Frame = new Frame();
frame.bitmap = new BitmapData(target.width*2, target.height*2, true, 0x000000000);
frame.bitmap.draw(target, target.transform.matrix, target.transform.colorTransform);
return frame;
}
This is a variation on the last post. It captures 40 small bitmaps of a blurred circle fading in and out and then draws 8000 of them to the stage.






