[1日1Wonderfl]9日目: スプレーっぽいなにか poor code version.

by soundkitchen
スプレーっぽい効果やってみたよ。
*
*  ちなみにこれは問題アリ版:
*      Graphics に延々と書き続けるのでメモリーも開放されないし、
*      途中から目に見えて遅くなっていくよ。
*      SWFProfiler を表示してると一目瞭然だよ。
♥0 | Line 57 | Modified 2009-05-13 23:44:27 | MIT License
play

ActionScript3 source code

/**
 * Copyright soundkitchen ( http://wonderfl.net/user/soundkitchen )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/9cRS
 */

/**
 *  スプレーっぽい効果やってみたよ。
 *
 *  ちなみにこれは問題アリ版:
 *      Graphics に延々と書き続けるのでメモリーも開放されないし、
 *      途中から目に見えて遅くなっていくよ。
 *      SWFProfiler を表示してると一目瞭然だよ。
 */
package
{
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    import com.flashdynamix.utils.SWFProfiler;

    [SWF(width=465, height=465, frameRate=30, backgroundColor=0xffffff)]

    public class Main extends Sprite
    {
        private var isMouseDown:Boolean;
        private var canvas:Shape;

        /**
         *  コンストラクタ
         */
        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        /**
         *  初期化
         */
        private function initialize(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

            //  プロファイラを仕込む
            SWFProfiler.init(this);

            //  マウスダウンされてる?フラグ
            isMouseDown = false;

            //  キャンバスとなる Shape 作って
            canvas = new Shape();
            //  特攻む
            addChild(canvas);

            //  ステージにイベント設定
            stage.addEventListener(Event.ENTER_FRAME, step);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
        }

        /**
         *  毎フレームの処理
         */
        private function step(evt:Event):void
        {
            //  マウスダウンされてなければおしまい
            if (!isMouseDown) return;

            var i:uint,
                g:Graphics,
                angle:Number, distance:Number,
                tx:Number, ty:Number;

            //  キャンバスの Graphics を何回も使うので変数へ
            g = canvas.graphics;
            for (i=0; i<30; i++)
            {
                //  ドットを打つ位置を決めるデータを用意
                angle = Math.random() * Math.PI * 2;
                distance = Math.random() * 30;

                //  ドットを打つ位置を決定
                tx = mouseX + Math.cos(angle) * distance;
                ty = mouseY + Math.sin(angle) * distance;

                //  書き込む
                g.beginFill(0xff0000);
                g.drawRect(tx, ty, 1, 1);
                g.endFill();
            }
        }

        /**
         *  stage のマウスダウン
         */
        private function mouseDownHandler(evt:MouseEvent):void
        {
            isMouseDown = true;
        }

        /**
         *  stage のマウスアップ
         */
        private function mouseUpHandler(evt:MouseEvent):void
        {
            isMouseDown = false;
        }
    }
}

Forked