Odyssey — 0001
"The thing's hollow—it goes on forever—and—oh my God—it's full of stars!"
package
{
import flash.display.*;
import flash.events.Event;
import flash.filters.DisplacementMapFilter;
import flash.filters.DisplacementMapFilterMode;
import flash.geom.*;
import flash.utils.getTimer;
// Odyssey — 0001 —————————————————————————————————————————————————————————
// "The thing's hollow—it goes on forever—and—oh my God—it's full of stars!"
// —————————————————————————————————————————————————————————— The FlashMafia
public class Odyssey0001 extends Sprite {
private const NUM_P : int = 2222;
private const SW : int = 465;
private const SH : int = 465;
private const CX : Number = SW >> 1;
private const CY : Number = SH >> 1;
/* */
private var _p : Particle;
private var _bmd : BitmapData;
private var _xyFilter : DisplacementMapFilter;
private var _mapRotBit : Sprite;
private var _mapRot : Sprite;
private var _map : BitmapData;
private var _mtx : Matrix = new Matrix(1, 0, 0, 1, CX, CY);
private var _dstp : Point = new Point();
private var _colors : Vector.<uint> = Vector.<uint>([0x224488, 0x809099, 0xAAAAAA, 0xCCCCC0, 0xFFFFF0, 0xFFFFFF, 0xBBBBB8, 0xDDDDD0, 0x708099]);
public function Odyssey0001()
{
stage.stageFocusRect = mouseEnabled = mouseChildren = tabEnabled = tabChildren = false;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.HIGH;
stage.frameRate = 32;
stage.fullScreenSourceRect = new Rectangle(0, 0, 465, 465);
/* */
var bm : Bitmap = new Bitmap(_bmd = new BitmapData(SW, SH, false, 0x000000));
bm.opaqueBackground = 0x000000;
addChild(bm);
_p = new Particle();
var p : Particle = _p;
var n : uint = NUM_P;
while (n-- != 0) {
p.x = CX;
p.y = CY;
p = p.next = new Particle();
}
/* create map */
var cx : int = CX + 130;
var colors1 : Array = [0xEEEEEE, 0];
var colors2 : Array = [255, 0];
var alphas : Array = [1, 1];
var ratios : Array = [0, 255];
var mtx1 : Matrix = new Matrix();
mtx1.createGradientBox(cx * 2, cx * 2);
var mtx2 : Matrix = new Matrix();
mtx2.createGradientBox(cx * 2, cx * 2, Math.PI / 2);
var sh0 : Shape = new Shape();
sh0.graphics.beginGradientFill(GradientType.LINEAR, colors1, alphas, ratios, mtx1);
sh0.graphics.drawCircle(cx, cx, cx);
sh0.graphics.endFill();
var sh1 : Shape = new Shape();
sh1.graphics.beginGradientFill(GradientType.LINEAR, colors2, alphas, ratios, mtx2);
sh1.graphics.drawCircle(cx, cx, cx);
sh1.graphics.endFill();
var px : int = SW + 400;
var py : int = SH + 400;
var mtx3 : Matrix = new Matrix();
mtx3.tx = (px - cx * 2) / 2;
mtx3.ty = (py - cx * 2) / 2;
_map = new BitmapData(px, py, false, 8355711);
_map.draw(sh0, mtx3);
var bmd : BitmapData = new BitmapData(px, py, false, 8355711);
bmd.draw(sh1, mtx3);
_map.copyChannel(bmd, bmd.rect, _dstp, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE);
_mapRot = new Sprite();
_mapRotBit = new Sprite();
_mapRot.addChild(_mapRotBit);
_xyFilter = new DisplacementMapFilter(_map);
var bmp : Bitmap = new Bitmap(_map.clone());
bmp.x = -CX - 200;
bmp.y = -CY - 200;
_mapRotBit.addChild(bmp);
bmd.dispose();
/* */
addEventListener(Event.ENTER_FRAME, oef);
}
private function oef(e : Event) : void {
var p : Particle = _p;
var cnt : uint;
while (p != null) {
p.x = p.x + p.vx;
p.y = p.y + p.vy;
p.x = (p.x < 0) ? SW : (p.x > SW) ? 0 : p.x;
p.y = (p.y < 0) ? SH : (p.y > SH) ? 0 : p.y;
_bmd.setPixel(p.x, p.y, _colors[cnt & 7]);
++cnt;
p = p.next;
}
_xyFilter.componentX = BitmapDataChannel.RED;
_xyFilter.componentY = BitmapDataChannel.BLUE;
_xyFilter.mode = DisplacementMapFilterMode.IGNORE;
_xyFilter.mapPoint = _dstp;
var t : Number = getTimer() / 15000;
_mapRotBit.rotation = 45 * Math.sin(t * 3);
_map.draw(_mapRot, _mtx);
_xyFilter.scaleX = 256 + 128 * Math.sin(t * t);
_xyFilter.scaleY = 128 + 256 * Math.sin(1 / t);
_bmd.applyFilter(_bmd, _bmd.rect, _dstp, _xyFilter);
_bmd.threshold(_bmd, _bmd.rect, _dstp, '<', 4284572001, 4278190080, 16711680, false);
}
}
}
internal class Particle {
public var next : Particle;
public var x : Number = 0;
public var y : Number = 0;
public var vx : Number = -1 + Math.random() * 2;
public var vy : Number = -1 + Math.random() * 2;
}