// forked from hiro_rec's ぐにょーん1 package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.BlendMode; import flash.display.Sprite; import flash.events.Event; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.filters.DisplacementMapFilter; import flash.geom.Point; public class Main extends Sprite { private static const LEVEL:uint = 1; private static const BLUR:BlurFilter = new BlurFilter(0, 0, BitmapFilterQuality.LOW); private var container:Sprite; private var originalBmd:BitmapData; private var bmd:BitmapData; private var bmp:Bitmap; private var radian:Number = .0; private var radius:Number = 100.; private var sx:Number = .0; private var sy:Number = .0; [SWF(width="640", height="480",backgroundColor="0x0096ff", frameRate="30")] public function Main() { container = new Sprite(); addChild(container); originalBmd = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0x00CCCCCC); var seed:Number = Math.floor(Math.random() * 10); var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.GREEN | BitmapDataChannel.BLUE; originalBmd.perlinNoise(10, 10, 10, seed, false, true, channels, false, null); bmd = originalBmd.clone(); bmp = new Bitmap(bmd); container.addChild(bmp); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(event:Event):void { radian += Math.PI / radius; sx += ((stage.stageWidth / 2 - stage.mouseX) * Math.cos(radian) * 10 - sx) * 0.9; sy += ((stage.stageHeight / 2 - stage.mouseY) * Math.sin(radian) * 10 - sy) * 0.9; bmd.draw(originalBmd); var mapFilter:DisplacementMapFilter = new DisplacementMapFilter(bmd, new Point(), BitmapDataChannel.RED, BitmapDataChannel.RED, sx, sy, "wrap", 0, 0); bmp.filters = [mapFilter]; bmd.draw(container); bmd.applyFilter(bmd, bmd.rect, new Point(), BLUR); bmd.draw(container); } } } forked from: ぐにょーん1