前回、フラクタルノイズを用いた雲をFLASHで描画するサンプルを掲載いたしました。
今回はこちらを改良し、時間経過とともに雲が変化していくものを作成してみました。
改良箇所は5カ所。まずは変数の追加です。
次に、init関数にタイマー処理を追加します。public var CloudDataV:Array; // 乱数速度テーブル
public var CloudDataA:Array; // 乱数加速度テーブル
タイマー処理に伴い、新たにコールバック関数を一つ追加します。private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
// 背景色との加算合成
this.blendMode = BlendMode.ADD;
// BitmasDataの初期化
screen = new BitmapData( stage.stageWidth, stage.stageHeight, true, 0xFF000000 );
addChild( new Bitmap( screen ) );
// 雲データの初期化
initCloud();
var timer:Timer = new Timer(1, 0);
timer.addEventListener(TimerEvent.TIMER, refresh);
timer.start();
}
雲の初期化関数initCloudに、速度テーブルと加速度テーブルの初期化処理を加えます。private function refresh(e:TimerEvent):void
{
renderCloudData();
}
最後に、renderCloudData関数の変数宣言直後に雲の更新処理を加えます。private function initCloud():void {
// 配列の確保+乱数テーブルの作成
CloudData = new Array(SIZE + 1);
CloudDataD = new Array(SIZE + 1);
CloudDataV = new Array(SIZE + 1);
CloudDataA = new Array(SIZE + 1);
var i:int;
var j:int;
for (i = 0; i < SIZE + 1;++i)
{
CloudData[i] = new Array(SIZE + 1);
CloudDataD[i] = new Array(SIZE + 1);
CloudDataV[i] = new Array(SIZE + 1);
CloudDataA[i] = new Array(SIZE + 1);
for (j = 0; j < SIZE + 1;++j) {
CloudDataD[i][j] = (Math.random()*2-1.0);
CloudDataV[i][j] = 0;
CloudDataA[i][j] = 0;
}
}
// 乱数テーブルから雲データの作成
updateCloud();
}
処理の内容としては、雲の濃度値を変化させるために、濃度値の1フレームあたりの変化量(速度)と、変化量の変化量(加速度)を設けて、乱数テーブルを毎フレーム変化させています。// 雲の更新
for (i = 0; i < SIZE+1;++i) {
for (j = 0; j < SIZE+1;++j ) {
// 加速度をランダムに変化
CloudDataA[i][j] += (Math.random() * 2 - 1.0);
CloudDataA[i][j] *= 0.9;
// 速度に加速度を加算
CloudDataV[i][j] += CloudDataA[i][j];
CloudDataV[i][j] *= 0.9;
// 速度を乱数テーブルに加算
CloudDataD[i][j] += CloudDataV[i][j];
CloudDataD[i][j] *= 0.9;
}
}
updateCloud();
FLASH的な部分としては、タイマーによるビットマップデータオブジェクトの描画アニメーションのサンプルです。無駄なフラクタルノイズで着飾ってます。
