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


embed

FORKED
  1. // forked from miniapp's DisplacementMapFilter 球
  2. /**
  3.  * マウスドラッグで大きく
  4.  */
  5. package {
  6.     
  7.     import com.flashdynamix.utils.SWFProfiler;
  8.     import flash.display.Bitmap;
  9.     import flash.display.BitmapData;
  10.     import flash.display.BitmapDataChannel;
  11.     import flash.display.Loader;
  12.     import flash.display.Sprite;
  13.     import flash.display.StageAlign;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.filters.BitmapFilter;
  18.     import flash.filters.BitmapFilterQuality;
  19.     import flash.filters.DisplacementMapFilter;
  20.     import flash.filters.DisplacementMapFilterMode;
  21.     import flash.geom.Matrix;
  22.     import flash.geom.Point;
  23.     import flash.geom.Rectangle;
  24.     import flash.net.URLRequest;
  25.     import flash.system.LoaderContext;
  26.     import flash.system.System;
  27.     
  28.     [SWF(backgroundColor="0xFFFFFF", width="465", height="465", frameRate="60")]
  29.     public class Main6_5 extends Sprite {
  30.         
  31.         private static const WIDTH_STAGE:uint = 465;
  32.         private static const HEIGHT_STAGE:uint = 465;
  33.         
  34.         public function Main6_5() {
  35.             if (stage) init();
  36.             else addEventListener(Event.ADDED_TO_STAGE, init);
  37.         }
  38.         
  39.         private var _jpeg:Bitmap;
  40.         private var _canvas:Sprite = new Sprite();
  41.         private var _nowDmfsValue:uint = 0;
  42.         private var _dmfs:Vector.<DisplacementMapFilter> = new Vector.<DisplacementMapFilter>();
  43.         private var _radiuses:Vector.<Number> = new Vector.<Number>();
  44.         
  45.         private function init(e:Event = null):void {
  46.             removeEventListener(Event.ADDED_TO_STAGE, init);
  47.             stage.scaleMode = StageScaleMode.NO_SCALE;
  48.             SWFProfiler.init(this);
  49.             
  50.                         Wonderfl.capture_delay( 3 );
  51.             var context:LoaderContext = new LoaderContext();
  52.             context.checkPolicyFile = true;
  53.             
  54.             var loader:Loader = new Loader();
  55.             loader.load(new URLRequest("http://miniapp.org/wonderfl/image/beck.jpg"), context);
  56.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
  57.                 _jpeg = Bitmap(loader.content);
  58.                 loader.contentLoaderInfo.removeEventListener(this, arguments.callee);
  59.                 start();
  60.             });
  61.         }
  62.         
  63.         private function start():void {
  64.             _canvas.addChild(_jpeg);
  65.             _canvas.x = (WIDTH_STAGE - _canvas.width) / 2;
  66.             _canvas.y = (HEIGHT_STAGE - _canvas.height) / 2;
  67.             addChild(_canvas);
  68.             
  69.             var radius:Number = 50;
  70.             var dmf:DisplacementMapFilter = createDMF(radius);
  71.             _radiuses.push(radius);
  72.             _dmfs.push(dmf);
  73.             
  74.             radius = 100;
  75.             dmf = createDMF(radius);
  76.             _radiuses.push(radius);
  77.             _dmfs.push(dmf);
  78.             
  79.             addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  80.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDowHander);
  81.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHander);
  82.         }
  83.         
  84.         private function createDMF(radius:Number):DisplacementMapFilter {
  85.             var mapBitmap:BitmapData = new BitmapData(radius * 2, radius * 2false);
  86.             var maxDistance:Number = radius / 2;//適当。適宜調整
  87.             var dmf:DisplacementMapFilter = new DisplacementMapFilter(
  88.                 mapBitmap,
  89.                 new Point(),
  90.                 BitmapDataChannel.BLUE,//x方向の移動に使う色
  91.                 BitmapDataChannel.GREEN,//y方向の移動に使う色
  92.                 maxDistance, 
  93.                 maxDistance, 
  94.                 DisplacementMapFilterMode.COLOR
  95.             );
  96.             
  97.             var yMax:int = radius * 2;
  98.             var xMax:int = radius * 2;
  99.             var center:Number = radius;
  100.             mapBitmap.lock();
  101.             for (var yy:int = 0; yy < yMax; ++yy) {
  102.                 for (var xx:int = 0; xx < xMax; ++xx) {
  103.                     var dx:Number = xx - center;
  104.                     var dy:Number = yy - center;
  105.                     var distance:Number = Math.sqrt(dx * dx + dy * dy);
  106.                         
  107.                     if (distance <= radius) { 
  108.                         //座標変換公式
  109.                         //http://kenpei-web.hp.infoseek.co.jp/math/coordinates/
  110.                         //中心に近づくほど90度(Math.PI / 2)になるようにする。
  111.                         var rate:Number = distance / radius;
  112.                         var theta:Number = (Math.PI / 2) * rate;
  113.                         var phi:Number = Math.atan2(dy, dx);
  114.                         var toX:Number = (radius * Math.sin(theta) * Math.cos(phi)) + center;
  115.                         var toY:Number = (radius * Math.sin(theta) * Math.sin(phi)) + center;
  116.                         
  117.                         var colorX:Number = getColor(xx - toX, dmf.scaleX);
  118.                         var colorY:Number = getColor(yy - toY, dmf.scaleY);
  119.                         var color:uint = colorY << 8 | colorX;
  120.                     }
  121.                     else {
  122.                         //何も変化しない色
  123.                         color = 0x80808080;
  124.                     }
  125.                     mapBitmap.setPixel(xx, yy, color);
  126.                 }
  127.             }
  128.             mapBitmap.unlock();
  129.             return dmf;
  130.         }
  131.         
  132.         /**
  133.          * @param    diff 動かしたい距離
  134.          * @param    scale 取り得る値の最大値
  135.          * @return
  136.          */
  137.         private function getColor(diff:Number, scale:Number):uint {
  138.             return Math.round((diff * 0x100) / scale) + 0x80;
  139.         }
  140.         
  141.         private function enterFrameHandler(e:Event):void {
  142.             var dmf:DisplacementMapFilter = _dmfs[_nowDmfsValue];
  143.             
  144.             //マウス中心に動かす
  145.             var p:Point = dmf.mapPoint;
  146.             p.x = _canvas.mouseX - _radiuses[_nowDmfsValue];
  147.             p.y = _canvas.mouseY - _radiuses[_nowDmfsValue];
  148.             dmf.mapPoint = p;
  149.             
  150.             _jpeg.filters = [dmf];
  151.         }
  152.         
  153.         private function mouseUpHander(e:MouseEvent):void {
  154.             _nowDmfsValue = 0;
  155.         }
  156.         
  157.         private function mouseDowHander(e:MouseEvent):void {
  158.             _nowDmfsValue = 1;
  159.         }
  160.     }
  161. }
noswf
  1. // forked from miniapp's DisplacementMapFilter 球
  2. /**
  3.  * マウスドラッグで大きく
  4.  */
  5. package {
  6.     
  7.     import com.flashdynamix.utils.SWFProfiler;
  8.     import flash.display.Bitmap;
  9.     import flash.display.BitmapData;
  10.     import flash.display.BitmapDataChannel;
  11.     import flash.display.Loader;
  12.     import flash.display.Sprite;
  13.     import flash.display.StageAlign;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.filters.BitmapFilter;
  18.     import flash.filters.BitmapFilterQuality;
  19.     import flash.filters.DisplacementMapFilter;
  20.     import flash.filters.DisplacementMapFilterMode;
  21.     import flash.geom.Matrix;
  22.     import flash.geom.Point;
  23.     import flash.geom.Rectangle;
  24.     import flash.net.URLRequest;
  25.     import flash.system.LoaderContext;
  26.     import flash.system.System;
  27.     
  28.     [SWF(backgroundColor="0xFFFFFF", width="465", height="465", frameRate="60")]
  29.     public class Main6_5 extends Sprite {
  30.         
  31.         private static const WIDTH_STAGE:uint = 465;
  32.         private static const HEIGHT_STAGE:uint = 465;
  33.             private var fbd:Bitmap=null;        
  34.         public function Main6_5() {
  35.             if (stage) init();
  36.             else addEventListener(Event.ADDED_TO_STAGE, init);
  37.         }
  38.         
  39.         private var _jpeg:Bitmap;
  40.         private var _canvas:Sprite = new Sprite();
  41.         private var _nowDmfsValue:uint = 0;
  42.         private var _dmfs:Vector.<DisplacementMapFilter> = new Vector.<DisplacementMapFilter>();
  43.         private var _radiuses:Vector.<Number> = new Vector.<Number>();
  44.         
  45.         private function init(e:Event = null):void {
  46.             removeEventListener(Event.ADDED_TO_STAGE, init);
  47.             stage.scaleMode = StageScaleMode.NO_SCALE;
  48.             SWFProfiler.init(this);
  49.             
  50.                         Wonderfl.capture_delay( 3 );
  51.             var context:LoaderContext = new LoaderContext();
  52.             context.checkPolicyFile = true;
  53.             
  54.             var loader:Loader = new Loader();
  55.             loader.load(new URLRequest("http://miniapp.org/wonderfl/image/beck.jpg"), context);
  56.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
  57.                 _jpeg = Bitmap(loader.content);
  58.                 loader.contentLoaderInfo.removeEventListener(this, arguments.callee);
  59.                 start();
  60.             });
  61.         }
  62.         
  63.         private function start():void {
  64.             _canvas.addChild(_jpeg);
  65.             _canvas.x = (WIDTH_STAGE - _canvas.width) / 2;
  66.             _canvas.y = (HEIGHT_STAGE - _canvas.height) / 2;
  67.             addChild(_canvas);
  68.             
  69.             var radius:Number = 50;
  70.             var dmf:DisplacementMapFilter = createDMF(radius);
  71.             _radiuses.push(radius);
  72.             _dmfs.push(dmf);
  73.             
  74.             radius = 100;
  75.             dmf = createDMF(radius);
  76.             _radiuses.push(radius);
  77.             _dmfs.push(dmf);
  78.             
  79.             addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  80.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDowHander);
  81.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHander);
  82.         }
  83.         
  84.         private function createDMF(radius:Number):DisplacementMapFilter {
  85.             var mapBitmap:BitmapData = new BitmapData(radius * 2, radius * 2false);
  86.             var maxDistance:Number = radius / 2;//適当。適宜調整
  87.             var dmf:DisplacementMapFilter = new DisplacementMapFilter(
  88.                 mapBitmap,
  89.                 new Point(),
  90.                 BitmapDataChannel.BLUE,//x方向の移動に使う色
  91.                 BitmapDataChannel.GREEN,//y方向の移動に使う色
  92.                 maxDistance, 
  93.                 maxDistance, 
  94.                 DisplacementMapFilterMode.COLOR
  95.             );
  96.             
  97.             var yMax:int = radius * 2;
  98.             var xMax:int = radius * 2;
  99.             var center:Number = radius;
  100.             mapBitmap.lock();
  101.             for (var yy:int = 0; yy < yMax; ++yy) {
  102.                 for (var xx:int = 0; xx < xMax; ++xx) {
  103.                     var dx:Number = xx - center;
  104.                     var dy:Number = yy - center;
  105.                     var distance:Number = Math.sqrt(dx * dx + dy * dy);
  106.                         
  107.                     if (distance <= radius) { 
  108.                         //座標変換公式
  109.                         //http://kenpei-web.hp.infoseek.co.jp/math/coordinates/
  110.                         //中心に近づくほど90度(Math.PI / 2)になるようにする。
  111.                         var rate:Number = distance / radius;
  112.                         var theta:Number = (Math.PI / 2) * rate;
  113.                         var phi:Number = Math.atan2(dy, dx);
  114.                         var toX:Number = (radius * Math.sin(theta) * Math.cos(phi)) + center;
  115.                         var toY:Number = (radius * Math.sin(theta) * Math.sin(phi)) + center;
  116.                         
  117.                         var colorX:Number = getColor(xx - toX, dmf.scaleX);
  118.                         var colorY:Number = getColor(yy - toY, dmf.scaleY);
  119.                         var color:uint = colorY << 8 | colorX;
  120.                     }
  121.                     else {
  122.                         //何も変化しない色
  123.                         color = 0x80808080;
  124.                     }
  125.                     mapBitmap.setPixel(xx, yy, color);
  126.                 }
  127.             }
  128.             mapBitmap.unlock();
  129.             return dmf;
  130.         }
  131.         
  132.         /**
  133.          * @param    diff 動かしたい距離
  134.          * @param    scale 取り得る値の最大値
  135.          * @return
  136.          */
  137.         private function getColor(diff:Number, scale:Number):uint {
  138.             return Math.round((diff * 0x100) / scale) + 0x80;
  139.         }
  140.         
  141.         private function enterFrameHandler(e:Event):void {
  142.             var dmf:DisplacementMapFilter = _dmfs[_nowDmfsValue];
  143.             
  144.             //マウス中心に動かす
  145.             var p:Point = dmf.mapPoint;
  146.             p.x = _canvas.mouseX - _radiuses[_nowDmfsValue];
  147.             p.y = _canvas.mouseY - _radiuses[_nowDmfsValue];
  148.             dmf.mapPoint = p;
  149.             
  150.             _jpeg.filters = [dmf];
  151.         }
  152.         
  153.         private function mouseUpHander(e:MouseEvent):void {
  154.             _nowDmfsValue = 0;
  155.         }
  156.         
  157.         private function mouseDowHander(e:MouseEvent):void {
  158.             _nowDmfsValue = 1;
  159.         }
  160.     }
  161. }
noswf
  1. // forked from miniapp's DisplacementMapFilter 球
  2. /**
  3.  * マウスドラッグで大きく
  4.  */
  5. package {
  6.     
  7.     import com.flashdynamix.utils.SWFProfiler;
  8.     import flash.display.Bitmap;
  9.     import flash.display.BitmapData;
  10.     import flash.display.BitmapDataChannel;
  11.     import flash.display.Loader;
  12.     import flash.display.Sprite;
  13.     import flash.display.StageAlign;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.filters.BitmapFilter;
  18.     import flash.filters.BitmapFilterQuality;
  19.     import flash.filters.DisplacementMapFilter;
  20.     import flash.filters.DisplacementMapFilterMode;
  21.     import flash.geom.Matrix;
  22.     import flash.geom.Point;
  23.     import flash.geom.Rectangle;
  24.     import flash.net.URLRequest;
  25.     import flash.system.LoaderContext;
  26.     import flash.system.System;
  27.     
  28.     [SWF(backgroundColor="0xFFFFFF", width="465", height="465", frameRate="60")]
  29.     public class Main6_5 extends Sprite {
  30.         
  31.         private static const WIDTH_STAGE:uint = 465;
  32.         private static const HEIGHT_STAGE:uint = 465;
  33.         
  34.         public function Main6_5() {
  35.             if (stage) init();
  36.             else addEventListener(Event.ADDED_TO_STAGE, init);
  37.         }
  38.         
  39.         private var _jpeg:Bitmap;
  40.         private var _canvas:Sprite = new Sprite();
  41.         private var _nowDmfsValue:uint = 0;
  42.         private var _dmfs:Vector.<DisplacementMapFilter> = new Vector.<DisplacementMapFilter>();
  43.         private var _radiuses:Vector.<Number> = new Vector.<Number>();
  44.         
  45.         private function init(e:Event = null):void {
  46.             removeEventListener(Event.ADDED_TO_STAGE, init);
  47.             stage.scaleMode = StageScaleMode.NO_SCALE;
  48.             SWFProfiler.init(this);
  49.             
  50.                         Wonderfl.capture_delay( 3 );
  51.             var context:LoaderContext = new LoaderContext();
  52.             context.checkPolicyFile = true;
  53.             
  54.             var loader:Loader = new Loader();
  55.             loader.load(new URLRequest("http://miniapp.org/wonderfl/image/beck.jpg"), context);
  56.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
  57.                 _jpeg = Bitmap(loader.content);
  58.                 loader.contentLoaderInfo.removeEventListener(this, arguments.callee);
  59.                 start();
  60.             });
  61.         }
  62.         
  63.         private function start():void {
  64.             _canvas.addChild(_jpeg);
  65.             _canvas.x = (WIDTH_STAGE - _canvas.width) / 2;
  66.             _canvas.y = (HEIGHT_STAGE - _canvas.height) / 2;
  67.             addChild(_canvas);
  68.             
  69.             var radius:Number = 50;
  70.             var dmf:DisplacementMapFilter = createDMF(radius);
  71.             _radiuses.push(radius);
  72.             _dmfs.push(dmf);
  73.             
  74.             radius = 100;
  75.             dmf = createDMF(radius);
  76.             _radiuses.push(radius);
  77.             _dmfs.push(dmf);
  78.             
  79.             addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  80.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDowHander);
  81.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHander);
  82.         }
  83.         
  84.         private function createDMF(radius:Number):DisplacementMapFilter {
  85.             var mapBitmap:BitmapData = new BitmapData(radius * 2, radius * 2false);
  86.             var maxDistance:Number = radius / 2;//適当。適宜調整
  87.             var dmf:DisplacementMapFilter = new DisplacementMapFilter(
  88.                 mapBitmap,
  89.                 new Point(),
  90.                 BitmapDataChannel.BLUE,//x方向の移動に使う色
  91.                 BitmapDataChannel.GREEN,//y方向の移動に使う色
  92.                 maxDistance, 
  93.                 maxDistance, 
  94.                 DisplacementMapFilterMode.COLOR
  95.             );
  96.             
  97.             var yMax:int = radius * 2;
  98.             var xMax:int = radius * 2;
  99.             var center:Number = radius;
  100.             mapBitmap.lock();
  101.             for (var yy:int = 0; yy < yMax; ++yy) {
  102.                 for (var xx:int = 0; xx < xMax; ++xx) {
  103.                     var dx:Number = xx - center;
  104.                     var dy:Number = yy - center;
  105.                     var distance:Number = Math.sqrt(dx * dx + dy * dy);
  106.                         
  107.                     if (distance <= radius) { 
  108.                         //座標変換公式
  109.                         //http://kenpei-web.hp.infoseek.co.jp/math/coordinates/
  110.                         //中心に近づくほど90度(Math.PI / 2)になるようにする。
  111.                         var rate:Number = distance / radius;
  112.                         var theta:Number = (Math.PI / 2) * rate;
  113.                         var phi:Number = Math.atan2(dy, dx);
  114.                         var toX:Number = (radius * Math.sin(theta) * Math.cos(phi)) + center;
  115.                         var toY:Number = (radius * Math.sin(theta) * Math.sin(phi)) + center;
  116.                         
  117.                         var colorX:Number = getColor(xx - toX, dmf.scaleX);
  118.                         var colorY:Number = getColor(yy - toY, dmf.scaleY);
  119.                         var color:uint = colorY << 8 | colorX;
  120.                     }
  121.                     else {
  122.                         //何も変化しない色
  123.                         color = 0x80808080;
  124.                     }
  125.                     mapBitmap.setPixel(xx, yy, color);
  126.                 }
  127.             }
  128.             mapBitmap.unlock();
  129.             return dmf;
  130.         }
  131.         
  132.         /**
  133.          * @param    diff 動かしたい距離
  134.          * @param    scale 取り得る値の最大値
  135.          * @return
  136.          */
  137.         private function getColor(diff:Number, scale:Number):uint {
  138.             return Math.round((diff * 0x100) / scale) + 0x80;
  139.         }
  140.         
  141.         private function enterFrameHandler(e:Event):void {
  142.             var dmf:DisplacementMapFilter = _dmfs[_nowDmfsValue];
  143.             
  144.             //マウス中心に動かす
  145.             var p:Point = dmf.mapPoint;
  146.             p.x = _canvas.mouseX - _radiuses[_nowDmfsValue];
  147.             p.y = _canvas.mouseY - _radiuses[_nowDmfsValue];
  148.             dmf.mapPoint = p;
  149.             
  150.             _jpeg.filters = [dmf];
  151.         }
  152.         
  153.         private function mouseUpHander(e:MouseEvent):void {
  154.             _nowDmfsValue = 0;
  155.         }
  156.         
  157.         private function mouseDowHander(e:MouseEvent):void {
  158.             _nowDmfsValue = 1;
  159.         }
  160.     }
  161. }
noswf
  1. // forked from miniapp's DisplacementMapFilter 球
  2. /**
  3.  * マウスドラッグで大きく
  4.  */
  5. package {
  6.     
  7.     import com.flashdynamix.utils.SWFProfiler;
  8.     import flash.display.Bitmap;
  9.     import flash.display.BitmapData;
  10.     import flash.display.BitmapDataChannel;
  11.     import flash.display.Loader;
  12.     import flash.display.Sprite;
  13.     import flash.display.StageAlign;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.filters.BitmapFilter;
  18.     import flash.filters.BitmapFilterQuality;
  19.     import flash.filters.DisplacementMapFilter;
  20.     import flash.filters.DisplacementMapFilterMode;
  21.     import flash.geom.Matrix;
  22.     import flash.geom.Point;
  23.     import flash.geom.Rectangle;
  24.     import flash.net.URLRequest;
  25.     import flash.system.LoaderContext;
  26.     import flash.system.System;
  27.     
  28.     [SWF(backgroundColor="0xFFFFFF", width="465", height="465", frameRate="60")]
  29.     public class Main6_5 extends Sprite {
  30.         
  31.         private static const WIDTH_STAGE:uint = 465;
  32.         private static const HEIGHT_STAGE:uint = 465;
  33.         
  34.         public function Main6_5() {
  35.             if (stage) init();
  36.             else addEventListener(Event.ADDED_TO_STAGE, init);
  37.         }
  38.         
  39.         private var _jpeg:Bitmap;
  40.         private var _canvas:Sprite = new Sprite();
  41.         private var _nowDmfsValue:uint = 0;
  42.         private var _dmfs:Vector.<DisplacementMapFilter> = new Vector.<DisplacementMapFilter>();
  43.         private var _radiuses:Vector.<Number> = new Vector.<Number>();
  44.         
  45.         private function init(e:Event = null):void {
  46.             removeEventListener(Event.ADDED_TO_STAGE, init);
  47.             stage.scaleMode = StageScaleMode.NO_SCALE;
  48.             SWFProfiler.init(this);
  49.             
  50.                         Wonderfl.capture_delay( 3 );
  51.             var context:LoaderContext = new LoaderContext();
  52.             context.checkPolicyFile = true;
  53.             
  54.             var loader:Loader = new Loader();
  55.             loader.load(new URLRequest("http://miniapp.org/wonderfl/image/beck.jpg"), context);
  56.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
  57.                 _jpeg = Bitmap(loader.content);
  58.                 loader.contentLoaderInfo.removeEventListener(this, arguments.callee);
  59.                 start();
  60.             });
  61.         }
  62.         
  63.         private function start():void {
  64.             _canvas.addChild(_jpeg);
  65.             _canvas.x = 0;
  66.             _canvas.y = 0;
  67.             addChild(_canvas);
  68.             
  69.             var radius:Number = 50;
  70.             var dmf:DisplacementMapFilter = createDMF(radius);
  71.             _radiuses.push(radius);
  72.             _dmfs.push(dmf);
  73.             
  74.             radius = 100;
  75.             dmf = createDMF(radius);
  76.             _radiuses.push(radius);
  77.             _dmfs.push(dmf);
  78.             
  79.             addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  80.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDowHander);
  81.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHander);
  82.         }
  83.         
  84.         private function createDMF(radius:Number):DisplacementMapFilter {
  85.             var mapBitmap:BitmapData = new BitmapData(radius * 2, radius * 2false);
  86.             var maxDistance:Number = radius / 2;//適当。適宜調整
  87.             var dmf:DisplacementMapFilter = new DisplacementMapFilter(
  88.                 mapBitmap,
  89.                 new Point(),
  90.                 BitmapDataChannel.BLUE,//x方向の移動に使う色
  91.                 BitmapDataChannel.GREEN,//y方向の移動に使う色
  92.                 maxDistance, 
  93.                 maxDistance, 
  94.                 DisplacementMapFilterMode.COLOR
  95.             );
  96.             
  97.             var yMax:int = radius * 2;
  98.             var xMax:int = radius * 2;
  99.             var center:Number = radius;
  100.             mapBitmap.lock();
  101.             for (var yy:int = 0; yy < yMax; ++yy) {
  102.                 for (var xx:int = 0; xx < xMax; ++xx) {
  103.                     var dx:Number = xx - center;
  104.                     var dy:Number = yy - center;
  105.                     var distance:Number = Math.sqrt(dx * dx + dy * dy);
  106.                         
  107.                     if (distance <= radius) { 
  108.                         //座標変換公式
  109.                         //http://kenpei-web.hp.infoseek.co.jp/math/coordinates/
  110.                         //中心に近づくほど90度(Math.PI / 2)になるようにする。
  111.                         var rate:Number = distance / radius;
  112.                         var theta:Number = (Math.PI / 2) * rate;
  113.                         var phi:Number = Math.atan2(dy, dx);
  114.                         var toX:Number = (radius * Math.sin(theta) * Math.cos(phi)) + center;
  115.                         var toY:Number = (radius * Math.sin(theta) * Math.sin(phi)) + center;
  116.                         
  117.                         var colorX:Number = getColor(xx - toX, dmf.scaleX);
  118.                         var colorY:Number = getColor(yy - toY, dmf.scaleY);
  119.                         var color:uint = colorY << 8 | colorX;
  120.                     }
  121.                     else {
  122.                         //何も変化しない色
  123.                         color = 0x80808080;
  124.                     }
  125.                     mapBitmap.setPixel(xx, yy, color);
  126.                 }
  127.             }
  128.             mapBitmap.unlock();
  129.             return dmf;
  130.         }
  131.         
  132.         /**
  133.          * @param    diff 動かしたい距離
  134.          * @param    scale 取り得る値の最大値
  135.          * @return
  136.          */
  137.         private function getColor(diff:Number, scale:Number):uint {
  138.             return Math.round((diff * 0x100) / scale) + 0x80;
  139.         }
  140.         
  141.         private function enterFrameHandler(e:Event):void {
  142.             var dmf:DisplacementMapFilter = _dmfs[_nowDmfsValue];
  143.             
  144.             //マウス中心に動かす
  145.             var p:Point = dmf.mapPoint;
  146.             p.x = _canvas.mouseX - _radiuses[_nowDmfsValue];
  147.             p.y = _canvas.mouseY - _radiuses[_nowDmfsValue];
  148.             dmf.mapPoint = p;
  149.             
  150.             _jpeg.filters = [dmf];
  151.         }
  152.         
  153.         private function mouseUpHander(e:MouseEvent):void {
  154.             _nowDmfsValue = 0;
  155.         }
  156.         
  157.         private function mouseDowHander(e:MouseEvent):void {
  158.             _nowDmfsValue = 1;
  159.         }
  160.     }
  161. }
noswf
  1. // forked from miniapp's DisplacementMapFilter 球
  2. /**
  3.  * マウスドラッグで大きく
  4.  */
  5. package {
  6.     
  7.     import com.flashdynamix.utils.SWFProfiler;
  8.     import flash.display.Bitmap;
  9.     import flash.display.BitmapData;
  10.     import flash.display.BitmapDataChannel;
  11.     import flash.display.Loader;
  12.     import flash.display.Sprite;
  13.     import flash.display.StageAlign;
  14.     import flash.display.StageScaleMode;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.filters.BitmapFilter;
  18.     import flash.filters.BitmapFilterQuality;
  19.     import flash.filters.DisplacementMapFilter;
  20.     import flash.filters.DisplacementMapFilterMode;
  21.     import flash.geom.Matrix;
  22.     import flash.geom.Point;
  23.     import flash.geom.Rectangle;
  24.     import flash.net.URLRequest;
  25.     import flash.system.LoaderContext;
  26.     import flash.system.System;
  27.     
  28.     [SWF(backgroundColor="0xFFFFFF", width="465", height="465", frameRate="60")]
  29.     public class Main6_5 extends Sprite {
  30.         
  31.         private static const WIDTH_STAGE:uint = 465;
  32.         private static const HEIGHT_STAGE:uint = 465;
  33.         
  34.         public function Main6_5() {
  35.             if (stage) init();
  36.             else addEventListener(Event.ADDED_TO_STAGE, init);
  37.         }
  38.         
  39.         private var _jpeg:Bitmap;
  40.         private var _canvas:Sprite = new Sprite();
  41.         private var _nowDmfsValue:uint = 0;
  42.         private var _dmfs:Vector.<DisplacementMapFilter> = new Vector.<DisplacementMapFilter>();
  43.         private var _radiuses:Vector.<Number> = new Vector.<Number>();
  44.         
  45.         private function init(e:Event = null):void {
  46.             removeEventListener(Event.ADDED_TO_STAGE, init);
  47.             stage.scaleMode = StageScaleMode.NO_SCALE;
  48.             SWFProfiler.init(this);
  49.             
  50.                         Wonderfl.capture_delay( 3 );
  51.             var context:LoaderContext = new LoaderContext();
  52.             context.checkPolicyFile = true;
  53.             
  54.             var loader:Loader = new Loader();
  55.             loader.load(new URLRequest("http://miniapp.org/wonderfl/image/beck.jpg"), context);
  56.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
  57.                 _jpeg = Bitmap(loader.content);
  58.                 loader.contentLoaderInfo.removeEventListener(this, arguments.callee);
  59.                 start();
  60.             });
  61.         }
  62.         
  63.         private function start():void {
  64.             _canvas.addChild(_jpeg);
  65.             _canvas.x = (WIDTH_STAGE - _canvas.width) / 2;
  66.             _canvas.y = (HEIGHT_STAGE - _canvas.height) / 2;
  67.             addChild(_canvas);
  68.             
  69.             var radius:Number = 50;
  70.             var dmf:DisplacementMapFilter = createDMF(radius);
  71.             _radiuses.push(radius);
  72.             _dmfs.push(dmf);
  73.             
  74.             radius = 100;
  75.             dmf = createDMF(radius);
  76.             _radiuses.push(radius);
  77.             _dmfs.push(dmf);
  78.             
  79.             addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  80.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDowHander);
  81.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHander);
  82.         }
  83.         
  84.         private function createDMF(radius:Number):DisplacementMapFilter {
  85.             var mapBitmap:BitmapData = new BitmapData(radius * 2, radius * 2false);
  86.             var maxDistance:Number = radius / 2;//適当。適宜調整
  87.             var dmf:DisplacementMapFilter = new DisplacementMapFilter(
  88.                 mapBitmap,
  89.                 new Point(),
  90.                 BitmapDataChannel.BLUE,//x方向の移動に使う色
  91.                 BitmapDataChannel.GREEN,//y方向の移動に使う色
  92.                 maxDistance, 
  93.                 maxDistance, 
  94.                 DisplacementMapFilterMode.COLOR
  95.             );
  96.             
  97.             var yMax:int = radius * 2;
  98.             var xMax:int = radius * 2;
  99.             var center:Number = radius;
  100.             mapBitmap.lock();
  101.             for (var yy:int = 0; yy < yMax; ++yy) {
  102.                 for (var xx:int = 0; xx < xMax; ++xx) {
  103.                     var dx:Number = xx - center;
  104.                     var dy:Number = yy - center;
  105.                     var distance:Number = Math.sqrt(dx * dx + dy * dy);
  106.                         
  107.                     if (distance <= radius) { 
  108.                         //座標変換公式
  109.                         //http://kenpei-web.hp.infoseek.co.jp/math/coordinates/
  110.                         //中心に近づくほど90度(Math.PI / 2)になるようにする。
  111.                         var rate:Number = distance / radius;
  112.                         var theta:Number = (Math.PI / 2) * rate;
  113.                         var phi:Number = Math.atan2(dy, dx);
  114.                         var toX:Number = (radius * Math.sin(theta) * Math.cos(phi)) + center;
  115.                         var toY:Number = (radius * Math.sin(theta) * Math.sin(phi)) + center;
  116.                         
  117.                         var colorX:Number = getColor(xx - toX, dmf.scaleX);
  118.                         var colorY:Number = getColor(yy - toY, dmf.scaleY);
  119.                         var color:uint = colorY << 8 | colorX;
  120.                     }
  121.                     else {
  122.                         //何も変化しない色
  123.                         color = 0x80808080;
  124.                     }
  125.                     mapBitmap.setPixel(xx, yy, color);
  126.                 }
  127.             }
  128.             mapBitmap.unlock();
  129.             return dmf;
  130.         }
  131.         
  132.         /**
  133.          * @param    diff 動かしたい距離
  134.          * @param    scale 取り得る値の最大値
  135.          * @return
  136.          */
  137.         private function getColor(diff:Number, scale:Number):uint {
  138.             return Math.round((diff * 0x100) / scale) + 0x80;
  139.         }
  140.         
  141.         private function enterFrameHandler(e:Event):void {
  142.             var dmf:DisplacementMapFilter = _dmfs[_nowDmfsValue];
  143.             
  144.             //マウス中心に動かす
  145.             var p:Point = dmf.mapPoint;
  146.             p.x = _canvas.mouseX - _radiuses[_nowDmfsValue];
  147.             p.y = _canvas.mouseY - _radiuses[_nowDmfsValue];
  148.             dmf.mapPoint = p;
  149.             
  150.             _jpeg.filters = [dmf];
  151.         }
  152.         
  153.         private function mouseUpHander(e:MouseEvent):void {
  154.             _nowDmfsValue = 0;
  155.         }
  156.         
  157.         private function mouseDowHander(e:MouseEvent):void {
  158.             _nowDmfsValue = 1;
  159.         }
  160.     }
  161. }
noswf
Get Adobe Flash Player