DisplacementMapFilterのテスト
perlinNoiseを利用したDisplacementMapFilterテスト
@author okoi
/**
* 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
)
);
}
}
}