/** * http://miniapp.org/blog/2009/05/04/106/ * DisplacementMapFilterを使ってマウスの位置に移動させる * ステージサイズ100 * 100で作ってるので拡大して表示してます。 */ package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.filters.DisplacementMapFilter; import flash.filters.DisplacementMapFilterMode; import flash.geom.Point; import flash.geom.Rectangle; [SWF(backgroundColor="0xFFFFFF", width="100", height="100", frameRate="60")] public class Main5_7 extends Sprite { private static const WIDTH_STAGE:uint = 100; private static const HEIGHT_STAGE:uint = 100; public function Main5_7() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private var _widthBox:uint = 20; private var _heightBox:uint = 20; private var _rect:Rectangle = new Rectangle( (WIDTH_STAGE - _widthBox) * Math.random(), //ランダムな場所に配置する (HEIGHT_STAGE - _heightBox) * Math.random(), _widthBox, _heightBox ); private var _canvas:Sprite = new Sprite(); private var _mapBitmap:BitmapData = new BitmapData(WIDTH_STAGE, HEIGHT_STAGE, false); private var _dmf:DisplacementMapFilter = new DisplacementMapFilter( _mapBitmap, new Point(), BitmapDataChannel.BLUE,//x方向の移動に使う色 BitmapDataChannel.GREEN,//y方向の移動に使う色 WIDTH_STAGE * 2, //取り得るx値の最大 * 2 HEIGHT_STAGE * 2, //取り得るy値の最大 * 2 DisplacementMapFilterMode.COLOR ); private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); //stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; addChild(_canvas); //ランダムな場所に四角を描きます。 var bmpd:BitmapData = new BitmapData(WIDTH_STAGE, HEIGHT_STAGE, false); bmpd.fillRect(_rect, 0x0); var bmp:Bitmap = new Bitmap(bmpd); _canvas.addChild(bmp); //trace(_rect.x, _rect.y); //trueで色と場所を確認 if (false) { //確認用 addChild(new Bitmap(_mapBitmap)); var sp:Sprite = new Sprite(); sp.graphics.beginFill(0); sp.graphics.drawRect(_rect.x, _rect.y, _rect.width, _rect.height); addChild(sp); } addEventListener(Event.ENTER_FRAME, enterFrameHandler); } /** * * @param diff 動かしたい対象までの距離 * @param scale 取り得る値の最大値 * @return */ private function getColor(diff:Number, scale:Number):uint { return Math.round((diff * 0x100) / scale) + 0x80; } private function enterFrameHandler(e:Event):void { _mapBitmap.lock(); var diffX:Number = mouseX - _rect.x; var diffY:Number = mouseY - _rect.y; //目的地に色を塗る for (var yy:uint = 0; yy < HEIGHT_STAGE; ++yy) { for (var xx:uint = 0; xx < WIDTH_STAGE; ++xx) { var toX:Number = xx + diffX; var toY:Number = yy + diffY; var dx:Number = xx - toX; var dy:Number = yy - toY; var colorX:uint = getColor(dx, _dmf.scaleX); var colorY:uint = getColor(dy, _dmf.scaleY); var color:uint = colorY << 8 | colorX; _mapBitmap.setPixel(xx, yy, color); } } _mapBitmap.unlock(); _canvas.filters = [_dmf]; } } } DisplacementMapFilterのテスト