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

DisplacementMapFilterのテスト

perlinNoiseを利用したDisplacementMapFilterテスト
@author okoi
Get Adobe Flash player
by okoi 07 Apr 2010
/**
 * Copyright okoi ( http://wonderfl.net/user/okoi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/tKeU
 */

//
//	perlinNoiseを利用したDisplacementMapFilterテスト
//	@author okoi
//
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BitmapDataChannel;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.filters.DisplacementMapFilter;
	import flash.filters.DisplacementMapFilterMode;
	import flash.text.TextField;
	
    [SWF(backgroundColor=0x000000)]
    
  
	
	public class Main extends Sprite 
	{
		private var _perlin:BitmapData;
		private var _perlinOffset:Array;
		
		private var _canvas:BitmapData;
		
		private var _text:TextField;
		private var _textPos:Array = new Array();
		private static const TEXTNUM:int = 20;
		
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			//	比較対象の背景としてPerlinNoise用のBitmapDataを作成
			_perlin = new BitmapData( stage.stageWidth, stage.stageHeight, true, 0x0 );
			_perlinOffset = [new Point()];

			//	DisplacementMapFilterをかけるオブジェクトを描くBitmapData
			_canvas = _perlin.clone();
				
			addChild( new Bitmap( _canvas ) );
			addChild( new Bitmap( _perlin )	);
		
			_text = new TextField();
			_text.text = "ざわざわ・・・・";
			_text.textColor = 0xFFFFFF;
			for ( var i:int = 0; i < TEXTNUM; i++ )
			{
				_textPos.push( new Point( Math.random() * stage.stageWidth, Math.random() * stage.stageHeight ) );
			}	
			addEventListener( Event.ENTER_FRAME, Update );
			
		}
		
		private	function Update(e:Event):void 
		{
			_perlinOffset[0].x = (_perlinOffset[0].x + 1);
			
			_perlin.perlinNoise(
				64,							//	x 方向で使用する周波数(幅)
				64,							//	y 方向で使用する周波数(高さ)
				1,							//	重ねる回数 やりすぎると重い
				256,						//	適当な整数
				true,						//	補正があり、タイリング可能なノイズ生成を試みる(第09引数でスクロール時に効果的)
				true,						//	フラクタルノイズの有無。falseの場合、炎や海の波のような視覚効果
				BitmapDataChannel.ALPHA,	// (8 | 4 | 2 | 1),	//	ノイズ生成のチャンネル
				true,						//	グレースケール化
				_perlinOffset				//	第03引数で決めた各レイヤーをスクロールするためのPoint型の配列データ
				);
				
				
			//	テキストを_canvasに書き込む
			_canvas.fillRect( _canvas.rect, 0x00000000 );
			for ( var i:int = 0; i < TEXTNUM; i++ )
			{
				_canvas.draw( _text, new Matrix(1, 0, 0, 1, _textPos[i].x, _textPos[i].y) );
			}
			_canvas.applyFilter( _canvas, _canvas.rect, new Point(), 
				new DisplacementMapFilter(
					_perlin,
					new Point(),
					BitmapDataChannel.ALPHA, // X方向置き換えに使うchannel
        			BitmapDataChannel.ALPHA, // Y方向置き換えに使うchannel
					40,
					40,
					DisplacementMapFilterMode.CLAMP,
					0,
					0
				)
			);
		}
		
	}
	
}