package { import flash.desktop.NativeApplication import flash.display.*; import flash.display.Sprite; import flash.events.*; import flash.events.Event; import flash.events.MouseEvent; import flash.external.*; import flash.filesystem.*; import flash.filters.*; import flash.geom.*; import flash.media.*; import flash.net.*; import flash.net.FileReference; import flash.system.ApplicationDomain; import flash.text.TextFieldAutoSize; import flash.utils.*; import flash.utils.ByteArray; import mx.controls.Label; import mx.graphics.codec.PNGEncoder; /* * A Kaleidoscope Demonstration in Actionscript 3 * from shinedraw.com */ public class Kaleidoscope extends Sprite { private const PIXEL_BENDER:String="RadialCaleidoscope.pbj"; private static var APP_WIDTH:Number; private static var APP_HEIGHT:Number; private var IMAGE_DIAMETER; private var RADIUS:Number; private var NUMBER_ITEM:Number; private var __height:uint; private var reactToBeat:Number = 30; private var __width:uint; private var _kaleidoscope : Kaleidoscope; private var ba:ByteArray = new ByteArray(); private var bytes:ByteArray = new ByteArray(); private var circleSize:Number = 75; private var filter_loader:URLLoader; private var lineColor:Number = 0x000001; private var lineThickness:Number = 2; private var newAngle:Number; private var scaleOnBeat:Number = 1.5; // 110% private var thisBitmapData:BitmapData; private var startingAngle:Number; private var overlapFactor:Number; private var item:KaleidoscopeItem; public var _items:Array = new Array(); // Store all the Kaleidoscope item public function Kaleidoscope(image:BitmapData,vertex:Number,angle:Number,appWidth:Number,appHeight:Number, overlap:Number) { APP_WIDTH = appWidth; APP_HEIGHT = appHeight IMAGE_DIAMETER = Math.sqrt(APP_WIDTH*APP_WIDTH+APP_HEIGHT*APP_HEIGHT); RADIUS = 1.1*IMAGE_DIAMETER/2; // Radius of the Kaleidoscope Item//music.load(new URLRequest(mp3)); startingAngle=angle; NUMBER_ITEM=vertex*2; overlapFactor=overlap; thisBitmapData=image; addItems(); } ///////////////////////////////////////////////////// // Handlers ///////////////////////////////////////////////////// public function rotate(newAngle:Number):void { /*var spectrum:Number; var topFrequencyAmplitude:Number=0; SoundMixer.computeSpectrum(bytes, true, 0) for(spectrum=128;spectrum<256;spectrum++) { topFrequencyAmplitude+=Math.abs(bytes.readFloat()); } */ for(var i:int = 0; i < _items.length; i++) { var item : KaleidoscopeItem = _items[i] as KaleidoscopeItem; item.rotate(newAngle); //item.translate(topFrequencyAmplitude*5,topFrequencyAmplitude*5); } } public function on_mouse_move(e : MouseEvent):void{ for(var i:int = 0; i < _items.length; i++){ var item : KaleidoscopeItem = _items[i] as KaleidoscopeItem; var offsetY:Number = -e.stageY/ APP_HEIGHT * IMAGE_DIAMETER / 2 ; var offsetX:Number = (e.stageX- APP_WIDTH / 2)/ APP_WIDTH * IMAGE_DIAMETER / 2; item.translate(offsetX, offsetY); trace("mouse move"); } } public function translateItems(offsetX:Number,offsetY:Number):void{ for(var i:int = 0; i < _items.length; i++){ var item : KaleidoscopeItem = _items[i] as KaleidoscopeItem; item.translate(offsetX, offsetY); } } ///////////////////////////////////////////////////// // public Methods ///////////////////////////////////////////////////// public function addItems():void { var baseAngle:Number = 360 / NUMBER_ITEM; for (var i:int = 0; i < NUMBER_ITEM; i++) { item = new KaleidoscopeItem(thisBitmapData); item.x = -IMAGE_DIAMETER/2; item.y = -IMAGE_DIAMETER/2; item.init(baseAngle, IMAGE_DIAMETER, RADIUS, overlapFactor); addChild(item); var itemHolder:Sprite = new Sprite(); itemHolder.x = APP_WIDTH/2; itemHolder.y = APP_HEIGHT / 2; itemHolder.addChild(item); if (i % 2 == 0) { itemHolder.scaleX = - 1; } itemHolder.rotation = startingAngle+(baseAngle*i); addChild(itemHolder); _items.push(item); } } } }