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

[1日1Wonderfl]3日目:SandParticle 数に挑戦 200,000

1日1Wonderfl 3/30日目
4/27
テキストをプリレンダリングしてみるテスト
書き込むときにMatrixとか使わない高速な方法があるんだろうか?
4/28
Matrixとかなるべくnewしないようにしてみる
エフェクトかけてみた
加速度を導入
BitmapData.drawがやっぱりボトルネックっぽい
4/29
数を追求するほうに切り替えてみる 200,000個
配列削るときにもたるのでクリーンナップ処理やめた
Particle.nextやりたいけど時間切れ
// forked from yd_niku's [1日1Wonderfl]2日目:TextParticle パーティクル最適化に挑戦
// forked from yd_niku's [1日1Wonderfl]1日目:TextParticle プリレンダリング演習
package {
// 1日1Wonderfl 3/30日目

// 4/27
// テキストをプリレンダリングしてみるテスト
// 書き込むときにMatrixとか使わない高速な方法があるんだろうか?

// 4/28
// Matrixとかなるべくnewしないようにしてみる
// エフェクトかけてみた
// 加速度を導入
// BitmapData.drawがやっぱりボトルネックっぽい

// 4/29
// 数を追求するほうに切り替えてみる 200,000個
// 配列削るときにもたるのでクリーンナップ処理やめた
// Particle.nextやりたいけど時間切れ
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.text.*;
    import flash.filters.*;
    import flash.utils.*;
    import com.flashdynamix.utils.SWFProfiler;
    public class FlashTest extends Sprite {
        private var _canvas:BitmapData;
        private var _particles:Vector.<Particle>= new Vector.<Particle>();
        
        private var _statusField:TextField;

        public function FlashTest() {
            _canvas = new BitmapData( stage.stageWidth, stage.stageHeight, true, 0xFFFFFFFF );
            addChild( new Bitmap(_canvas) );
 
            stage.addEventListener( MouseEvent.CLICK, onClick );
            addEventListener( Event.ENTER_FRAME, enterFrame );
  
            _statusField = new TextField();
            addChild( _statusField );
            _statusField.x = 200;
            _statusField.y = 200;
            _statusField.width= stage.stageWidth;
            _statusField.selectable = false;
            _statusField.mouseEnabled= false;
            _statusField.defaultTextFormat = new TextFormat( "_sans", 12, 0xFF0000 );
            _statusField.text = "Please Click!";
            
            SWFProfiler.init( this );
        }

        private var _filter:BitmapFilter = new ColorMatrixFilter( [
            1, 0, 0, 0, 0,
            0, 1, 0, 0, 0,
            0, 0, 1, 0, 0,
            0, 0, 0, 0.99, 0
            ] );
        private const P:Point = new Point;
        public function enterFrame( e:Event ):void {
            var parcent:Number, aparcent:Number;
            const DIG2RAD:Number = Math.PI/180;
            const W:Number = stage.stageWidth;
            const H:Number = stage.stageHeight;

            _canvas.lock();
            _canvas.applyFilter( _canvas, _canvas.rect, P, _filter );
            for each( var p:Particle in _particles ) {
                if( p.life < 0 ) continue;
                p.ax = p.ax + ( p.vx = p.vx * 0.75 );
                p.ay = p.ay + ( p.vy = p.vy * 0.75 );
                p.x += p.ax;
                p.y += p.ay;
                p.ax *= 0.98;
                p.ay *= 0.98;
                if( p.x < 0 ) {
                    p.x += W;
                }
                else if( p.x > W ) {
                    p.x -= W;
                }
                if( p.y < 0 ) {
                    p.y += H;
                }
                else if( p.y > H ) {
                    p.y -= H;
                }
                p.life--;
                parcent = p.life*0.01;
                aparcent = 1.0 - parcent;
                var c:uint =0xFF000000 | (aparcent*0xFF)<<16 | (aparcent*0xFF)<<8 | (parcent*0xFF)<<0;
                _canvas.setPixel32( p.x, p.y, c );

            }
            _canvas.unlock();
        }
        public function onClick ( e:MouseEvent ):void {
            var clickX:Number = e.localX;
            var clickY:Number = e.localY;
            var vLength:Number= 5, length:Number, vX:Number, vY:Number;
            var angle:Number, p:Particle;
            const RAD:Number = Math.PI*2;
            _particles = null;
            _particles = new Vector.<Particle>();
            for( var i:int =0; i<200000; ++i ) {
                angle = Math.random()*RAD;
                length = vLength * (Math.random()*0.5 +0.5);
                vX= Math.cos(angle);
                vY= Math.sin(angle);
                p =  new Particle( clickX+vX*100*(Math.random()-0.5), clickY+ vY*100*(Math.random()-0.5),
                                           vX*length , vY*length );
                _particles.push( p );
            }
        }
    }
}
class Particle {
    public var x:Number;
    public var y:Number;
    public var ax:Number;
    public var ay:Number;
    public var vx:Number;
    public var vy:Number;
    public var life:int = 80;

    public function Particle( x:Number=0, y:Number=0, vx:Number=0, vy:Number=0 ){
        this.x = x;
        this.y = y;
        this.ax = 0;
        this.ay = 0;
        this.vx = vx;
        this.vy = vy;
        life += Math.floor( Math.random()*20 );
    }
}