forked from: Noodle2
// forked from FLASHMAFIA's Noodle2
package {
import flash.display.CapsStyle;
import flash.display.GradientType;
import flash.display.LineScaleMode;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Rectangle;
[SWF(width = '465', height = '465')]
public class Noodle2 extends Sprite {
/* */
private const NUM_BITS : uint = 1 << 10;
/* */
private var node0 : Node;
private var node22 : Node;
private var thk0 : Number = 0.0;
private var thkD : Number = 0.0;
private var thkT : Number = 0.0;
private var thkDT : Number = 0.0;
private var mood : uint;
private var colorMoods : Vector.<int> = Vector.<int>([0x030101, 0x020100, 0x040301, 0x030201, 0x040302, 0x050301, 0x040201, 0x030201, 0x030202, 0x040201, 0x040404, 0x050505, 0x060504, 0x050403, 0x040302, 0x030201]);
private var bgColors : Array = [0x0, 0x0];
private var bgAlphas : Array = [1.0, 1.0];
private var bgRatios : Array = [0, 255];
private var mtx : Matrix;
private var fcnt : int;
public function Noodle2() {
var sw : int = stage.stageWidth;
var sh : int = stage.stageHeight;
stage.stageFocusRect = mouseEnabled = mouseChildren = tabEnabled = tabChildren = false;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.fullScreenSourceRect = new Rectangle(0, 0, sw, sh);
stage.quality = StageQuality.MEDIUM;
stage.frameRate = 64;
opaqueBackground = 0x0;
/* */
mtx = new Matrix();
mtx.createGradientBox(sw, sh, 3.141592653589793);
/* */
var node : Node = node0 = new Node();
var i : uint = NUM_BITS;
while (i-- != 0) {
node.c = 0x808080;
node.x = sw >> 1;
node.y = sh >> 1;
node.next = new Node();
node.next.prev = node;
node = node.next;
}
node0.prev = node;
/* */
node22 = node0.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next;
colorMoods.fixed = true;
mood = (colorMoods.length * Math.random());
/* */
addEventListener(Event.ENTER_FRAME, oef);
}
private function oef(e : Event) : void {
var sw : int = stage.stageWidth;
var sh : int = stage.stageHeight;
graphics.clear();
/* ==================================== TRACK MOUSE === */
var tx : Number = stage.mouseX;
var ty : Number = stage.mouseY;
if ((tx < 0) || (tx > sw) || (ty < 0) || (ty > sh)) {
tx = sw >> 1;
ty = sh >> 1;
}
/* ==================================== COLOR === */
if ((++fcnt & 15) == 15) {
mood = (colorMoods.length * Math.random());
}
var cinc : int = colorMoods[mood];
/* ========================================= BKG === */
var c0 : uint = node0.c;
var c1 : uint = node22.c;
if (c0 < c1) {
c0 ^= c1;
c1 ^= c0;
c0 ^= c1;
}
bgColors[0] = c0;
bgColors[1] = (int((c1 >> 16) * 0.66) << 16) | (int(((c1 >> 8) & 0xFF) * 0.66) << 8) | (int((c1 & 0xFF) * 0.66));
graphics.beginGradientFill(GradientType.RADIAL, bgColors, bgAlphas, bgRatios, mtx);
graphics.drawRect(0, 0, sw, sh);
graphics.endFill();
/* ==================================== GURF & SIZE === */
if ((fcnt & 127) == 1) {
thkT = 32 + 128 * Math.random();
thkDT = 1.0 - ((1.0 + 6.0 * Math.random()) / NUM_BITS);
}
thk0 += (thkT - thk0) * 0.04;
thkD += (thkDT - thkD) * 0.04;
var thk : Number = thk0;
var thkd : Number = thkD;
/* =================================== NODES :: 0 === */
var node : Node = node0;
node.a = 3.141592653589793 + Math.atan2(ty - node.y, tx - node.x);
node.x += ((tx - 0.5 + Math.random()) - node.x) * 0.16;
node.y += ((ty - 0.5 + Math.random()) - node.y) * 0.16;
node = node.next;
/* =================================== NODES DLL === */
graphics.moveTo(node.x, node.y);
while (node != null) {
var pnode : Node = node.prev;
var dx : Number = pnode.x - node.x;
var dy : Number = pnode.y - node.y;
var absy : Number = (dy < 0) ? -dy : dy;
node.a = 3.141592653589793 + ((dx >= 0.0) ? (dy < 0.0) ? -(0.7853981633974483 - 0.7853981633974483 * ((dx - absy) / (dx + absy))) : (0.7853981633974483 - 0.7853981633974483 * ((dx - absy) / (dx + absy))) : (dy < 0.0) ? -((3.0 * 0.7853981633974483) - 0.7853981633974483 * ((dx + absy) / (absy - dx))) : ((3.0 * 0.7853981633974483) - 0.7853981633974483 * ((dx + absy) / (absy - dx))));
node.x = pnode.x + 6 * Math.cos(pnode.a);
node.y = pnode.y + 6 * Math.sin(pnode.a);
c0 = pnode.c;
if ((c0 > 0xCCCCCC) || (c0 < 0x404040)) cinc = -cinc;
node.c = c0 + cinc;
thk *= thkd;
graphics.lineStyle(thk, node.c, 1.0, false, LineScaleMode.NONE, CapsStyle.ROUND);
graphics.lineTo(node.x, node.y);
node = node.next;
}
}
}
}
internal class Node {
public var next : Node;
public var prev : Node;
public var x : Number;
public var y : Number;
public var a : Number;
public var c : uint;
function Node() {
}
}