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

forked from: 風が吹くようななにか

Graphics 使って高速化してみたよ。
// forked from soundkitchen's 風が吹くようななにか
/**
 *  Graphics 使って高速化してみたよ。
 */
package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import flash.geom.Rectangle;

    import net.hires.debug.Stats;

    [SWF(frameRate=60, width=465, height=465, backgroundColor=0x000000)]
    public class Main extends Sprite
    {
        private var _canvas:Shape;
        private var _film:BitmapData;
        private var _rect:Rectangle;
        private var _particles:Vector.<Particle>;
        private var _mouseDowned:Boolean;

        public function Main()
        {
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        private function initialize(evt:Event):void
        {
            removeEventListener(evt.type, arguments.callee);

            _particles = new Vector.<Particle>();
            _canvas = new Shape();
            _rect = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
            _film = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0);
            addChild(new Bitmap(_film));

            addChildAt(new Stats(), 0);

            addEventListener(Event.ENTER_FRAME, step);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
        }

        private function step(evt:Event):void
        {
            var i:int,
                l:int,
                p:Particle,
                m:Point,
                g:Graphics;

            if (_mouseDowned)
            {
                for (i=0; i<5; i++)
                {
                    addParticle();
                }
            }

            g = _canvas.graphics;
            g.clear();

            l = _particles.length;
            for (i=0; i<l; i++)
            {
                p = _particles[i];
                p.update();

                g.beginFill(0xDFFE9E, p.alpha);
                for each (m in p.points)
                {
                    if (m == p.points[0])
                    {
                        g.moveTo(p.x + m.x, p.y + m.y);
                    }
                    else
                    {
                        g.lineTo(p.x + m.x, p.y + m.y);
                    }
                }
                g.endFill();

                if (p.alpha <= 0 || !_rect.contains(p.x, p.y))
                {
                    _particles.splice(i--, 1);
                    l--;
                }
            }

            _film.lock();
            _film.fillRect(_film.rect, 0);
            _film.draw(_canvas, null, null);
            _film.unlock();
        }

        private function addParticle():void
        {
            _particles.push(new Particle(mouseX, mouseY));
        }

        private function mouseDownHandler(evt:MouseEvent):void
        {
            _mouseDowned = true;
        }

        private function mouseUpHandler(evt:MouseEvent):void
        {
            _mouseDowned = false;
        }
    }
}

import flash.geom.Point;

class Particle
{
    //  TODO: remove such a poor code.
    public static const FRAME_RATE:int = 60;
    public static const WIND:Number = 9;
    public static const GRAVITY:Number = -3;

    //  declared each rect positions.
    private static var P1:Point = new Point(-5, -2);
    private static var P2:Point = new Point(5, -2);
    private static var P3:Point = new Point(5, 2);
    private static var P4:Point = new Point(-5, 2);
    private static var DEFAULT_POINTS:Array = [P1, P2, P3, P4];

    public var points:Vector.<Point>;
    public var x:Number;
    public var y:Number;
    public var alpha:Number;

    private var _vx:Number;
    private var _vy:Number;
    private var _tick:uint;

    public function Particle(x:Number, y:Number)
    {
        this.x = x;
        this.y = y;
        this.alpha = 1;
        this.points = new Vector.<Point>(4, true);

        var strength:Number,
            angle:Number,
            i:int,
            a:Number,
            p:Point;

        angle = Math.random() * Math.PI * 2;

        for (i=0; i<DEFAULT_POINTS.length; i++)
        {
            p = DEFAULT_POINTS[i];
            strength = Math.sqrt(p.x * p.x + p.y * p.y);
            a = Math.atan2(p.y, p.x);
            a += angle;
            points[i] = Point.polar(strength, a);
        }

        strength = Math.random() * 4;
        _vx = strength * Math.cos(angle);
        _vy = strength * Math.sin(angle);

        _tick = 0;
    }

    public function update():void
    {
        var t:Number,
            p:Point,
            strength:Number,
            angle:Number;

        _tick++;
        t = _tick / FRAME_RATE;

        x += WIND * t + _vx;
        y += GRAVITY * t + _vy;
        alpha -= .02;

        for each (p in points)
        {
            strength = Math.sqrt(p.x * p.x + p.y * p.y);
            angle = Math.atan2(p.y, p.x);
            angle += Math.PI * 2 / FRAME_RATE;
            p.x = strength * Math.cos(angle);
            p.y = strength * Math.sin(angle);
        }
    }
}