code on 2008-12-18
package {
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Point;
public class Main extends Sprite {
private var camera:Point;
private var brown:Point;
public function Main() {
camera = new Point();
brown = new Point();
addEventListener(Event.ADDED_TO_STAGE, initialize);
addEventListener(Event.ENTER_FRAME, transitionCamera);
addEventListener(Event.ENTER_FRAME, gogoBrown);
}
private function initialize(event:Event):void {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
brown.x = Math.random() * stage.stageWidth;
brown.y = Math.random() * stage.stageHeight;
for (var i:uint = 25; i-- > 0;) {
addChild(new Line(camera, brown));
}
}
private function transitionCamera(event:Event):void {
camera.x += Math.random() * 2 > 1? (Math.random() * 20) / 20: -(Math.random() * 20) / 20;
camera.y += Math.random() * 2.5 > 1? (Math.random() * 20) / 20: -(Math.random() * 20) / 20;
camera.x /= 1.01;
camera.y /= 1.01;
}
private function gogoBrown(event:Event):void {
brown.x += Math.random() * 2 > 1? (Math.random() * 10): -(Math.random() * 10);
brown.y += Math.random() * 2 > 1? (Math.random() * 10): -(Math.random() * 10);
if (brown.x < 0 || brown.x > stage.stageWidth) brown.x = Math.random() * stage.stageWidth;
if (brown.y < 0 || brown.y > stage.stageHeight) brown.y = Math.random() * stage.stageHeight;
}
public function remove(child:DisplayObject):void {
removeChild(child);
}
}
}
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.geom.Point;
class Line extends Sprite {
private var vx:Number;
private var vy:Number;
private var vs:Number;
private var camera:Point;
private var brown:Point;
public function Line(wvp:Point, b:Point) {
camera = wvp;
brown = b;
vs = Math.random() * 50 + 100;
vx = 0;
vy = 0;
addEventListener(Event.ADDED_TO_STAGE, initialize);
addEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
}
private function initialize(event:Event):void {
graphics.beginFill(0x000000);
graphics.drawCircle(0, 0, 2);
graphics.endFill();
x = Math.random() * stage.stageWidth;
y = Math.random() * stage.stageHeight;
addEventListener(Event.ENTER_FRAME, cruising);
addEventListener(Event.ENTER_FRAME, tail);
}
private function uninitialize(event:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, initialize);
removeEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
removeEventListener(Event.ENTER_FRAME, cruising);
removeEventListener(Event.ENTER_FRAME, tail);
}
private function cruising(event:Event):void {
vx += (brown.x - x) / vs;
vy += (brown.y - y) / vs;
vx /= 1.005;
vy /= 1.005;
x += vx / 1;
y += vy / 1;
}
private function tail(event:Event):void {
var tail:Tail = new Tail(this, camera);
tail.x = x;
tail.y = y;
parent.addChild(tail);
}
}
class Tail extends Sprite {
private var vx:Number;
private var vy:Number;
private var target:DisplayObject;
private var camera:Point;
public function Tail(targetObject:DisplayObject, camera:Point) {
target = targetObject;
this.camera = camera;
addEventListener(Event.ADDED_TO_STAGE, initialize);
addEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
}
private function initialize(event:Event):void {
x = target.x;
y = target.y;
var radius:uint = 5;
graphics.beginFill(0x000000);
graphics.drawCircle(-radius / 2, -radius / 2, radius);
graphics.drawCircle(-radius / 2, -radius / 2, radius / 3);
graphics.endFill();
addEventListener(Event.ENTER_FRAME, motion);
}
private function uninitialize(event:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, initialize);
removeEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
removeEventListener(Event.ENTER_FRAME, motion);
}
private function motion(event:Event):void {
x += camera.x;
y += camera.y;
scaleX /= 1.09;
scaleY /= 1.09;
if (width < 1) tellRemoveToParent();
}
private function tellRemoveToParent():void {
var p:Main = parent as Main;
p.remove(this);
}
}