flash on 2012-11-9
パーティクル祭りの原点「Liquid10000」を解説してみる。
[冒頭のコメントに追記あり](Download後の閲覧推奨)
前回のPerlinNoiseはこれの伏線だったのだよ!(偶然ですけど)
今回はPerlinNoiseの復習と、ビット演算子の勉強になります。
前々回
http://wonderfl.kayac.com/code/03190641c00b157abc0dbe7d6a513fa80ec987db
前回
http://wonderfl.kayac.com/code/cafcb78df40b35b0c0d571dc8fd8f1bda791e4b4
フォースマップっていう考え方らしいですが、
PerlinNoiseの色を速度に変換するらしいです。
てっきり難しい物理演算を使ってると思ってたよ・・・。
あと、前々回にやった花火の処理も加わってますので、
前々回・前回の内容を知ってると、にやけることができると思います。
これが分かると、あのsnowとかの作り方もわかるかな・・・?
次回はそれにするかもしれません。しないかもしれません。
パーティクル祭りに関してはclockmaker様のまとめが詳しいです。
この記事を元に、自身で高速化を試してみるのもありだと思います。
http://clockmaker.jp/blog/2009/04/particle/
http://clockmaker.jp/blog/2009/04/particle_fes/
Fork元を製作された方へ。
・Forkを拒否されたい場合は、何かしらのアクションでお伝えください。
削除いたします。(できれば生暖かく見守っていただけると嬉しいです)
中級者・上級者の方へ。
・何かアドバイスや校正箇所があれば、ご指摘お願いします。
初心者・初級者の方へ。
・一緒に勉強しましょう。何か質問があればどうぞ。
自分も初級者なので、答えられるか分かりませんが。(笑
[追記]
朝起きて見てみたらFavoriteの多さにびっくりして目が覚めました。
あくまで解説のみで、自分の作品ではないということで恐縮ではありますが、
こういう試みが支持されてるということは、自分の考えは間違ってなかったんだなと、
確信している次第です。
そしてこういう解
/**
* Copyright OlveraAtom ( http://wonderfl.net/user/OlveraAtom )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/vBrS
*/
package {
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.events.Event;
import flash.events.MouseEvent;
[SWF(width=465, height=465, backgroundColor=0x000000, frameRate=30)];
public class Liquid10000 extends Sprite {
private const nums:uint = 50000;
private var bmpDat:BitmapData;
private var vectorDat:BitmapData;
private var randomSeed:uint = Math.floor( Math.random() * 0xFFFF );
private var bmp:Bitmap;
private var vectorList:Array;
private var rect:Rectangle;
private var cTra:ColorTransform;
initialize();
}
private function initialize():void {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
bmpDat = new BitmapData( 465, 465, false, 0x000000 );
bmp= new Bitmap( bmpDat );
addChild( bmp );
vectorDat= new BitmapData( 465, 465, false, 0x0000FF );
randomSeed = Math.floor( Math.random() * 0xFFFF );
vectorDat.perlinNoise( 230, 230, 4, randomSeed, false, true, 1 | 2 | 0 | 0 );
rect = new Rectangle( 0, 0, 465, 465 );
cTra= new ColorTransform( 0, .8, .8, .9 );
vectorList= new Array();
for (var i:uint = 0; i < nums; i++) {
var px:Number = Math.random()*465;
var py:Number = Math.random() * 465;
var av:Point = new Point( 0, 0 );
var vv:Point = new Point( 0, 0 );
var pv:Point = new Point( px, py );
var hoge:VectorDat = new VectorDat( av, vv, pv);
vectorList.push( hoge );
}
addEventListener( Event.ENTER_FRAME, loop );
stage.addEventListener( MouseEvent.CLICK, resetFunc );
}
private function loop( e:Event ):void {
bmpDat.colorTransform( rect, cTra );
var list:Array = vectorList;
var len:uint = list.length;
for (var i:uint = 0; i < len; i++) {
var dots:VectorDat = list[i];
var col:Number = vectorDat.getPixel( dots.pv.x, dots.pv.y );
var r:uint = col >> 16 & 0xff;
var g:uint = col >> 8 & 0xff;
dots.av.x += ( r - 128 ) * .0005;
dots.av.y += ( g - 128 ) * .0005;
dots.vv.x += dots.av.x;
dots.vv.y += dots.av.y;
dots.pv.x += dots.vv.x;
dots.pv.y += dots.vv.y;
var _posX:Number = dots.pv.x;
var _posY:Number = dots.pv.y;
dots.av.x *= .96;
dots.av.y *= .96;
dots.vv.x *= .92;
dots.vv.y *= .92;
( _posX > 465 )?dots.pv.x = 0:
( _posX < 0 )?dots.pv.x = 465:0;
( _posY > 465 )?dots.pv.y = 0:
( _posY < 0 )?dots.pv.y = 465:0;
bmpDat.fillRect( new Rectangle( dots.pv.x, dots.pv.y, 1, 1), 0xFFFFFF );
}
}
private function resetFunc(e:MouseEvent):void {
randomSeed= Math.floor( Math.random() * 0xFFFF );
vectorDat.perlinNoise( 230, 230, 4,randomSeed, false, true, 1|2|0|0 );
vectorList= new Array();
for (var i:uint = 0; i < nums; i++) {
var px:Number = Math.random()*465;
var py:Number = Math.random()*465;
var av:Point = new Point( 0, 0 );
var vv:Point = new Point( 0, 0 );
var pv:Point = new Point( px, py );
var hoge:VectorDat = new VectorDat( av, vv, pv);
vectorList.push( hoge );
}
}
}
}
import flash.geom.Point;
class VectorDat {
public var vv:Point;
public var av:Point;
public var pv:Point;
function VectorDat( _av:Point, _vv:Point, _pv:Point ) {
vv = _vv;
av = _av;
pv = _pv;
}
}