notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : miniapp's DisplacementMapFilterのテスト [diff(23)]

embed

FORKED
  1. // forked from miniapp's 【修正】DisplacementMapFilterのテスト
  2. /**
  3.  * 結果は同じだけど、考え方が違ってたので修正
  4.  *
  5.  * http://miniapp.org/blog/2009/05/04/106/
  6.  * DisplacementMapFilterを使ってマウスの位置に移動させる
  7.  * ステージサイズ100 * 100で作ってるので拡大して表示してます。
  8.  */
  9. package {
  10.     
  11.     import flash.display.Bitmap;
  12.     import flash.display.BitmapData;
  13.     import flash.display.BitmapDataChannel;
  14.     import flash.display.Sprite;
  15.     import flash.display.StageAlign;
  16.     import flash.display.StageScaleMode;
  17.     import flash.events.Event;
  18.     import flash.filters.DisplacementMapFilter;
  19.     import flash.filters.DisplacementMapFilterMode;
  20.     import flash.geom.Point;
  21.     import flash.geom.Rectangle;
  22.     
  23.     [SWF(backgroundColor="0xFFFFFF", width="100", height="100", frameRate="60")]
  24.     public class Main5_7 extends Sprite {
  25.         
  26.         private static const WIDTH_STAGE:uint = 100;
  27.         private static const HEIGHT_STAGE:uint = 100;
  28.         
  29.         public function Main5_7() {
  30.             if (stage) init();
  31.             else addEventListener(Event.ADDED_TO_STAGE, init);
  32.         }
  33.         
  34.         private var _widthBox:uint = 20;
  35.         private var _heightBox:uint = 20;
  36.         private var _rect:Rectangle = new Rectangle(
  37.             int(WIDTH_STAGE * Math.random()), //ランダムな場所に配置する
  38.             int(HEIGHT_STAGE * Math.random()), 
  39.             _widthBox,
  40.             _heightBox
  41.         );
  42.         private var _canvas:Sprite = new Sprite();
  43.         private var _mapBitmap:BitmapData = new BitmapData(WIDTH_STAGE, HEIGHT_STAGE, false);
  44.         private var _dmf:DisplacementMapFilter = new DisplacementMapFilter(
  45.             _mapBitmap,
  46.             new Point(),
  47.             BitmapDataChannel.BLUE,//x方向の移動に使う色
  48.             BitmapDataChannel.GREEN,//y方向の移動に使う色
  49.             WIDTH_STAGE * 2//取り得るx値の最大 * 2
  50.             HEIGHT_STAGE * 2//取り得るy値の最大 * 2
  51.             DisplacementMapFilterMode.COLOR
  52.         );
  53.         
  54.         private function init(e:Event = null):void {
  55.             removeEventListener(Event.ADDED_TO_STAGE, init);
  56.             //stage.scaleMode = StageScaleMode.NO_SCALE;
  57.             stage.align = StageAlign.TOP_LEFT;
  58.             
  59.             addChild(_canvas);
  60.             //ランダムな場所に四角を描きます。
  61.             var bmpd:BitmapData = new BitmapData(WIDTH_STAGE, HEIGHT_STAGE, false);
  62.             bmpd.fillRect(_rect, 0x0);
  63.             var bmp:Bitmap = new Bitmap(bmpd);
  64.             _canvas.addChild(bmp);
  65.             //trace(_rect.x, _rect.y);
  66.             
  67.             //trueで色と場所を確認
  68.             if (false) { 
  69.                 //確認用
  70.                 addChild(new Bitmap(_mapBitmap));
  71.                 var sp:Sprite = new Sprite();
  72.                 sp.graphics.beginFill(0);
  73.                 sp.graphics.drawRect(_rect.x, _rect.y, _rect.width, _rect.height);
  74.                 addChild(sp);
  75.             }
  76.             
  77.             addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  78.         }
  79.         
  80.         /**
  81.          * 
  82.          * @param    diff 動かしたい対象までの距離
  83.          * @param    scale 取り得る値の最大値
  84.          * @return
  85.          */
  86.         private function getColor(diff:Number, scale:Number):uint {
  87.             return Math.round((diff * 0x100) / scale) + 0x80;
  88.         }
  89.         
  90.         private function enterFrameHandler(e:Event):void {
  91.             _mapBitmap.lock();
  92.             
  93.             var diffX:Number = mouseX - _rect.x;
  94.             var diffY:Number = mouseY - _rect.y;
  95.             //目的地に色を塗る
  96.             for (var yy:uint = 0; yy < HEIGHT_STAGE; ++yy) { 
  97.                 for (var xx:uint = 0; xx < WIDTH_STAGE; ++xx) { 
  98.                     //diffX離れた地点がxx地点に移る。
  99.                     var applyX:Number = xx - diffX;
  100.                     var applyY:Number = yy - diffY;
  101.                     
  102.                     var dx:Number = applyX - xx;
  103.                     var dy:Number = applyY - yy;
  104.                     
  105.                     var rateX:Number = dx / WIDTH_STAGE;
  106.                     var rateY:Number = dy / HEIGHT_STAGE;
  107.                     
  108.                     var colorX:uint = (rateX * 0x7F) + 0x80;
  109.                     var colorY:uint = (rateY * 0x7F) + 0x80;
  110.                     
  111.                     if (applyX == _rect.x && applyY == _rect.y) {
  112.                         //逆算テスト
  113.                         //フィルタが適用されるx値 = 目的地のx値 + ((色の強さ - 0x80) * dmf最大値) / 0x100
  114.                         dx = ((colorX - 0x80) * _dmf.scaleX) / 0x100;
  115.                         var originX:Number = xx + dx;
  116.                         trace(originX, applyX);
  117.                     }
  118.                     
  119.                     var color:uint = colorY << 8 | colorX;
  120.                     _mapBitmap.setPixel(xx, yy, color);
  121.                 }
  122.             }
  123.             _mapBitmap.unlock();
  124.             _canvas.filters = [_dmf];
  125.         }
  126.     }
  127. }
noswf
Get Adobe Flash Player