PerlinNoiseに必要な変数


var isGray:Boolean;               //グレースケールの判別


var chs:uint //使用するカラーチャンネル


var numOctaves:uint=4;            //ノイズを重ねる回数


var rSeed:Number=new Date()getTime(); //ランダムの整数


var stitch:Boolean //タイリング可能かどうか


var fractal:Boolean //falseの場合は炎や波のような揺らめき効果


var offsets:Array; //ノイズごとのオフセットの配列(ノイズ移動に必要)



PerlinNoiseに必要な引数


BitmapData.perlinNoise(①幅周波数、②高さ周波数、③重ねる回数、④ランダム回数、⑤タイリング、⑥フラクタル、⑦カラーチャンネル、⑧グレースケイル、⑨ノイズオフセット);


変数で表すと


BitmapData.perlinNoise(①width,②height,③numOctaves,④rSeed,⑤stitch,⑥fractal,⑦chs,⑧isGray,⑨offsets);


まずは全体のスクリプト

スクリプトはBitmapクラスを継承している


PerlinNoiseBitmap.as


package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.events.*;
import flash.geom.Point;
/**
* ...
* @author $(DefaultUser)
*/
public class PerlinNoiseBitmap extends Bitmap{
private var isGray:Boolean;
private var numOctaves:uint = 4;
private var chs:uint;
private var rSeed:Number = new Date().getTime();
private var stitch:Boolean = true;
private var fractal:Boolean = true;
private var offsets:Array;
//コンストラクタ
public function PerlinNoiseBitmap(w:uint, h:uint,isGray:Boolean=false) {
bitmapData = new BitmapData(w, h, true, 0x00FFFFFF);
this.isGray = isGray;
//使用チャンネル
chs = BitmapDataChannel.RED | BitmapDataChannel.BLUE | BitmapDataChannel.GREEN;
chs =chs| BitmapDataChannel.ALPHA;
//ノイズごとのオフセット
offsets = new Array();
for (var i:int = 0; i < numOctaves; i++) {
offsets.push(new Point(0, 0));
}
addEventListener(Event.ENTER_FRAME, onenter);
}
//ノイズ
private function onenter(e:Event):void {
for (var i:int = 0; i < numOctaves; i++) {
//左へ移動
offsets[i] = offsets[i].add(new Point(3, 0));
}
bitmapData.perlinNoise(width, height, numOctaves, rSeed, stitch, fractal, chs, isGray, offsets);
}

}

}


重要なのは赤い部分・・・のような気がします。


使用チャンネルは使用するチャンネルを BitmapDataChannnelで指定する。


perlinNoiseは複数のノイズが重なりあったノイズでノイズの個数はnumOctavesで指定するんですが、その指定した個々のノイズ事のオフセット値が必要になる。

なのでfor文を使用してノイズの個数分まずPointオブジェクトを作成して配列に追加する.


offsets=new Array();

for(var i:uint=0 ; i < numOctabes; i++){


//pelinNoiseの引数でのノイズオフセットは配列での指定が必要なので配列に追加

offsets.push(new Point(0,0));


}


スクロール(移動)するノイズを作成するにはENTER_FRAME内で処理する


function onEnter(e:Event):void{


for(var i:uint=0 ; i< numOctaves ; i++){


//左へ移動をさせる

offsets[i]=offsets[i].add(new Point(3,0));

}

}


add(new Point(3,0));メソッゾはポイントオブジェクトに他のオブジェクトを加算させる。上記の例だと、x軸の方向へ3ピクセルずつ移動させることになる。

そしてメソッドの引数に配列を入れる


bitmapData.perlinNoise(width, height, numOctaves, rSeed, stitch, fractal, chs, isGray, offsets);