Beautifl - Flash Gallery

Preview

[Stardust] Rainbow Pixels
paq 2010年1月18日 MIT License
?
マウスぐりぐり動かすと楽しいかも  
@author paq89
      package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.Sprite;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.filters.BlurFilter;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.utils.getTimer;
    import flash.utils.Timer;
    import frocessing.color.ColorHSV;
    import idv.cjcat.stardust.common.clocks.SteadyClock;
    import idv.cjcat.stardust.twoD.renderers.PixelRenderer;
    
    /**
     * マウスぐりぐり動かすと楽しいかも
     * @author paq89
     */
    [SWF(width = 465, height = 465, backgroundColor = 0x000000, frameRate = 60)]
    public class Main extends Sprite 
    {
        private static const ZERO_POINT:Point = new Point(0, 0);
        private static const STAGE_RECT:Rectangle = new Rectangle(0, 0, 465, 465);
        
        private var _bitmap:Bitmap;
        private var _bitmapData:BitmapData;
        private var _blurBitmap:Bitmap;
        private var _blurBitmapData:BitmapData;
        private var _emitter:PixelEmitter;
        private var _forcemap:BitmapData;
        private var _blur:BlurFilter;
        private var _color:uint;
        private var _hsv:ColorHSV;
        
        /**
         * コンストラクタ
         */
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            // 変数を初期化
            _blur = new BlurFilter(2, 2, 1);
            _color = 0;
            
            // 背景
            graphics.beginFill(0x000000); graphics.drawRect(0, 0, 465, 465);
            
            // 画質を低にする
            stage.quality = StageQuality.LOW;
            
            // パーティクルシステムの構築
            initStardust();
            
            // イベントリスナー
            addEventListener(Event.ENTER_FRAME, loop);
        }
        
        private function initStardust():void
        {
            // パーティクルを表示するビットマップを作成
            _bitmapData = new BitmapData(465, 465, true, 0x00000000);
            _bitmap = new Bitmap(_bitmapData);
            _blurBitmapData = new BitmapData(465, 465, false, 0x000000);
            _blurBitmap = new Bitmap(_blurBitmapData);
            addChild(_blurBitmap);
            addChild(_bitmap);
            
            _emitter = new PixelEmitter(new SteadyClock(3));
            _hsv = new ColorHSV(_color, 0.7);
            var renderer:PixelRenderer = new PixelRenderer(_bitmapData);
            renderer.addEmitter(_emitter);
            
            _forcemap = new BitmapData(465, 465);
            var timer:Timer = new Timer(1500);
            timer.addEventListener(TimerEvent.TIMER, tick);
            timer.start();
            tick();
        }
        
        /*
         * エンターフレームイベント
        */
        private function loop(e:Event):void 
        {
            // パーティクルの色を変更
            _color++;
            _hsv.h = _color;
            _emitter.color.color = _hsv.value;
            
            // 残像エフェクト
            _blurBitmapData.draw(_bitmapData);
            _blurBitmapData.applyFilter(_blurBitmapData, STAGE_RECT, ZERO_POINT, _blur);
            _bitmapData.fillRect(STAGE_RECT, 0x00000000);
            
            // エミッター更新
            _emitter.step();
            
            // エミッターの速度をマウス位置に合わせて変更
            _emitter.stepTimeInterval = mouseY*0.01;
        }
        
        /*
         * タイマーイベント
        */
        private function tick(e:TimerEvent = null):void 
        {
            // フォースマップを作成
            _forcemap.perlinNoise(100, 100, 2, getTimer(), true, true, BitmapDataChannel.RED | BitmapDataChannel.GREEN);
            
            // フォースマップをエミッターに適用
            _emitter.field.update(_forcemap);
        }
    }
    
}
import idv.cjcat.stardust.common.actions.Age;
import idv.cjcat.stardust.common.actions.DeathLife;
import idv.cjcat.stardust.common.clocks.Clock;
import idv.cjcat.stardust.common.initializers.Color;
import idv.cjcat.stardust.common.initializers.Life;
import idv.cjcat.stardust.common.initializers.Mass;
import idv.cjcat.stardust.common.math.UniformRandom;
import idv.cjcat.stardust.twoD.actions.Deflect;
import idv.cjcat.stardust.twoD.actions.Gravity;
import idv.cjcat.stardust.twoD.actions.Move;
import idv.cjcat.stardust.twoD.actions.SpeedLimit;
import idv.cjcat.stardust.twoD.deflectors.WrappingBox;
import idv.cjcat.stardust.twoD.emitters.Emitter2D;
import idv.cjcat.stardust.twoD.fields.BitmapField;
import idv.cjcat.stardust.twoD.initializers.Position;
import idv.cjcat.stardust.twoD.initializers.Velocity;
import idv.cjcat.stardust.twoD.zones.LazySectorZone;
import idv.cjcat.stardust.twoD.zones.SinglePoint;


class PixelEmitter extends Emitter2D
{
    public var field:BitmapField;
    public var color:Color;
    
    public function PixelEmitter(clock:Clock):void 
    {
        super(clock);
        
        color = new Color();
        addInitializer(color);
        addInitializer(new Position(new SinglePoint(232.5, 232.5)));
        addInitializer(new Mass(new UniformRandom(3, 1)));
        addInitializer(new Velocity(new LazySectorZone(10, 4)));
        addInitializer(new Life(new UniformRandom(200, 0)));
            
        field = new BitmapField(0, 60);
        field.massless = false;
        var gravity:Gravity = new Gravity();
        gravity.addField(field);
        
        var deflect:Deflect = new Deflect();
        deflect.addDeflector(new WrappingBox(0, 0, 465, 465));
        
        addAction(gravity);
        addAction(deflect);
        addAction(new Move());
        addAction(new Age());
        addAction(new DeathLife());
        addAction(new SpeedLimit(2));
    }
}