// forked from clockmaker's RGB Separater package { import flash.system.LoaderContext; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.BlendMode; import flash.display.Loader; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import flash.net.URLRequest; import flash.system.Security; [SWF(width = "465", height = "465", backgroundColor = "0x000000", frameRate = "30")] /** * 結構前に投稿されたのをほじくり返して勉強用に作成。 * ↓参考にさせていただきました。 * http://wonderfl.net/code/381f195b4aad8c2a14fc00ad03f638df25568a5d * */ public class DogRGBSeparator extends Sprite { private const WIDTH:Number = stage.stageWidth; private const HEIGHT:Number = stage.stageHeight; private static const IMAGE_PATH:String = "http://yanbaka.com/wonderfl/kote2.jpg"; private var max:Number; private var bmps:Array = []; private var speeds:Array = []; private var flg:Boolean = false; public function DogRGBSeparator() { var dx:Number = WIDTH - WIDTH/2; var dy:Number = HEIGHT - HEIGHT/2; max = Math.sqrt(dy*dy+dx*dx); loadImage(); } private function loadImage():void { graphics.beginFill(0x000000); graphics.drawRect(0, 0, WIDTH, HEIGHT); Security.loadPolicyFile("http://5ivestar.org/proxy/crossdomain.xml"); var context:LoaderContext = new LoaderContext(true); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); loader.load(new URLRequest("http://5ivestar.org/proxy/"+IMAGE_PATH), context); } private function onComplete(e:Event):void { var loader:Loader = Loader(e.target.loader); var rgb:Array = createRGB(Bitmap(loader.content)); var l:int = rgb.length; for (var i:int=0; i<l; i++) { var radius:Number = i/l*Math.PI*2; speeds.push(radius); var bmp:Bitmap = new Bitmap(rgb[i]); bmp.blendMode = BlendMode.SCREEN; bmp.scaleX = bmp.scaleY = 0.5; addChild(bmp); bmps.push(bmp); } var center:Shape = new Shape(); center.graphics.lineStyle(1, 0xFF0000); center.graphics.moveTo(-5, -5); center.graphics.lineTo(5, 5); center.graphics.moveTo(5, -5); center.graphics.lineTo(-5, 5); center.graphics.endFill(); center.x = WIDTH/2; center.y = HEIGHT/2; addChild(center); addEventListener(Event.ENTER_FRAME, loop); } private function loop(e:Event):void { var dx:Number = mouseX - WIDTH/2; var dy:Number = mouseY - HEIGHT/2; var dist:Number = Math.sqrt(dy*dy+dx*dx); var spd:Number = dist*0.001; var radius:Number = dist; var sc:Number = 1-dist/max; var l:int = bmps.length; for(var i:int=0; i<l; i++) { var bmp:Bitmap = bmps[i]; bmp.scaleX = bmp.scaleY = sc; speeds[i] += spd; var xx:Number = (WIDTH-bmp.width)/2; var yy:Number = (HEIGHT-bmp.height)/2; bmp.x = Math.cos(speeds[i])*radius+xx; bmp.y = Math.sin(speeds[i])*radius+yy; } } private function createRGB(bmp:Bitmap):Array { var r:BitmapData = new BitmapData(bmp.width, bmp.height, true, 0xFF000000); var g:BitmapData = new BitmapData(bmp.width, bmp.height, true, 0xFF000000); var b:BitmapData = new BitmapData(bmp.width, bmp.height, true, 0xFF000000); r.copyChannel(bmp.bitmapData, bmp.bitmapData.rect, new Point(), BitmapDataChannel.RED, BitmapDataChannel.RED); g.copyChannel(bmp.bitmapData, bmp.bitmapData.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); b.copyChannel(bmp.bitmapData, bmp.bitmapData.rect, new Point(), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE); return [r, g, b]; } } } Dog RGB Separator