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

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の多さにびっくりして目が覚めました。

あくまで解説のみで、自分の作品ではないということで恐縮ではありますが、

こういう試みが支持されてるということは、自分の考えは間違ってなかったんだなと、

確信している次第です。

そしてこういう解
Get Adobe Flash player
by OlveraAtom 09 Nov 2012
    Embed
/**
 * 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;



    }



}