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

[Stardust] マウスに追随するパーティクル

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

package {
    import flash.display.*;
    import flash.events.*;
    
    import idv.cjcat.stardust.common.clocks.SteadyClock;
    import idv.cjcat.stardust.common.emitters.Emitter;
    import idv.cjcat.stardust.common.renderers.Renderer;
    import idv.cjcat.stardust.twoD.renderers.DisplayObjectRenderer;

    [SWF(width=465, height=465, frameRate=48, backgroundColor=0)]
    public class Main extends Sprite {
        protected var emitter:Emitter; // エミッター
        protected var renderer:Renderer; // レンダラー

        // コンストラクタ
        public function Main() {
            
            // パーティクルシステムの構築
            emitter = new MyEmitter(new SteadyClock(1)); // エミッターに1フレームに発生させたい数値を指定
            renderer = new DisplayObjectRenderer(this);
            renderer.addEmitter(emitter);
            
            // エンターフレームイベントの登録
            addEventListener(Event.ENTER_FRAME, loop);
            
            // bg
            graphics.beginFill(0); graphics.drawRect(0,0,465,465);
        }

        // エンターフレームイベント
        private function loop(e:Event):void {
            // パーティクルの発生位置をマウス座標にする
            MyEmitter(emitter).point.x += (mouseX - MyEmitter(emitter).point.x) * 0.1;
            MyEmitter(emitter).point.y += (mouseY - MyEmitter(emitter).point.y) * 0.1;
            // エミッター更新
            emitter.step();
        }
    }
}

import idv.cjcat.stardust.common.actions.*;
import idv.cjcat.stardust.common.clocks.*;
import idv.cjcat.stardust.common.initializers.*;
import idv.cjcat.stardust.common.math.*;
import idv.cjcat.stardust.twoD.actions.*;
import idv.cjcat.stardust.twoD.emitters.*;
import idv.cjcat.stardust.twoD.initializers.*;
import idv.cjcat.stardust.twoD.zones.*;
/**
 * 2Dのエミッター
 * @author yasu
 */
class MyEmitter extends Emitter2D {

    public var point:SinglePoint = new SinglePoint();; // パーティクルの発生位置

    public function MyEmitter(clock:Clock = null) {
        super(clock);
        
        // ------------------------------
        // パーティクルの属性を定義
        // ------------------------------
        addInitializer(new DisplayObjectClass(Dust)); // アイテムを指定
        addInitializer(new Position(point)); // 発生位置
        addInitializer(new Velocity(new LazySectorZone(0.00001, 0))); // 移動距離
        addInitializer(new Life(new UniformRandom(30, 5))); // 生存する領域

        // ------------------------------
        // パーティクルのアクションを定義
        // ------------------------------
        addAction(new Age()); // 寿命を有効化
        addAction(new DeathLife()); // 消えるを有効化
        addAction(new Accelerate(0.2)); // 加速を有効化
        addAction(new Move()); // 移動を有効化
        addAction(new ScaleCurve(1, 7)); // スケール変化を有効化
    }
}

/**
 * パーティクルの飛ばすアイテム
 * @author yasu
 */
import flash.display.*;
import frocessing.color.ColorHSV;

class Dust extends Sprite {
    static private var col:int = 180;
    public function Dust() {
        var color:ColorHSV = new ColorHSV(col+=1, 0.7);
        // 円を描く
        graphics.beginFill(color.value, 0.5);
        graphics.drawCircle(16, 16, 16);
        graphics.beginFill(color.value, 1);
        graphics.drawCircle(16, 16, 8);
        // ブレンドモード
        blendMode = BlendMode.ADD;
    }
}