In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

TestDisplacementMapFilter

Get Adobe Flash player
by takashi 28 Feb 2010
    Embed
/**
 * Copyright takashi ( http://wonderfl.net/user/takashi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/e3hC
 */

package {
	import flash.display.Sprite;
	import flash.geom.Matrix;
	import flash.filters.DisplacementMapFilter;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
	import flash.filters.DisplacementMapFilterMode;
	
    import flash.geom.Point;
    import flash.geom.Rectangle;
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class TestDisplacementMapFilter extends Sprite {
		private var _bm:Bitmap;
		private var _bd:BitmapData;
		private const BD_WIDTH:Number = 440; //BitmapDataWidth
		private const BD_HEIGHT:Number = 270; //BitmapDataHeight
		
		private var _sp:Sprite = new Sprite();
		
		//perlinNoise() args
		private var _nX:Number = 0; 			//x 方向で使用する周波数。
		private var _nY:Number = 0; 			//y 方向で使用する周波数。
		private const PERLIN_OCTAVES:Number = 1; 		//numOctaves このノイズを作成するために組み合わせるオクターブ (つまり個々のノイズ関数) の数
		private const CHANNELS:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE | BitmapDataChannel.GREEN;//color channelOptions 任意の 4 つのカラーチャンネル値の組み合わせである数値
		private const PERLIN_SEED:int = Math.floor(Math.random() * 10);	//randomSeed ランダムシード (乱数の種) として使用する数値
		private var _offset:Array = new Array(); //各オクターブの x オフセットと y オフセットに対応するポイントの配列
		private var _speed:Array = new Array();
		
		
		private const SCALE_X:int = Math.random() * 1000;
		private const SCALE_Y:int = Math.random() * 1000;
		
		
		public function TestDisplacementMapFilter() {
			doInit();
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			addChild(_sp);
		}

		// 表示の初期化をします。
		private function doInit():void{
			// 関数の数だけ必要
			for (var i:Number = 0; i < PERLIN_OCTAVES; i++) {
				_offset[i] = new Point(Math.random() * BD_WIDTH / 2, Math.random() * BD_HEIGHT / 2);
				_speed[i] = new Point(Math.random() * 2, Math.random() * 2);
			}
			_nX = BD_WIDTH / 2 * Math.random();
			_nY = BD_HEIGHT / 2 * Math.random();
			
			_bd = new BitmapData(BD_WIDTH, BD_HEIGHT, true, 0xFFFFFF);
            _bm = new Bitmap(_bd);
            _sp.addChild(_bm);
		}


		private function onEnterFrame(e:Event):void {
			// オフセット位置の変更
			for (var i:Number = 0; i < PERLIN_OCTAVES; i++) {
				_offset[i].x += _speed[i].x;
				_offset[i].y += _speed[i].y;
			}
			// パーリンノイズ画像生成
			_bd.perlinNoise(_nX,
							_nY,
							PERLIN_OCTAVES,
							PERLIN_SEED,
							false,
							true,
							CHANNELS,
							false,
							_offset);
							
			// 歪みフィルターを作成
			var clickPoint:Point = new Point();
			var pt:Point = new Point(clickPoint.x - _sp.width / 2, clickPoint.y - _sp.height / 2); 
			var copyFilter:Array=new Array(); 
			var filter:DisplacementMapFilter
			= new DisplacementMapFilter(_bd,
										new Point(0, 0),
										CHANNELS,
										CHANNELS,
										100,
										100);
			copyFilter.push (filter);  
			_sp.filters = copyFilter;
			_bd.draw (_sp, new Matrix(1, 0, 0, 1, _sp.width,  _sp.height)); 
		}
	}
}