Beautifl - Flash Gallery

Thumbnail : [Stardust] RendererにcopyPixelsを使う(向きのあるパーティクル版)
[Stardust] RendererにcopyPixelsを使う(向きのあるパーティクル版)
Nicolas 2010-07-29 MIT License

再生するにはFlash Playerが必要です。デスクトップのブラウザでご覧ください。

// forked from paq's [Stardust] RendererにcopyPixelsを使う
package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.geom.ColorTransform;
    import idv.cjcat.stardust.common.clocks.SteadyClock;
    import net.hires.debug.Stats;
    
    [SWF(width = 465, height = 465, backgroundColor = 0x000000, frameRate = 60)]
    public class Main extends Sprite 
    {
        static private const COLOR_TRANSFORM:ColorTransform = new ColorTransform (0.9, 0.9, 0.95);
        private var _emitter:MyEmitter;
        private var _canvas:BitmapData;
        
        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);
            
            _canvas = new BitmapData(465, 465, false, 0x000000);
            var bmp:Bitmap = new Bitmap(_canvas);
            addChild(bmp);
            
            var sp:Shape = new Shape();
            var g:Graphics = sp.graphics;
            g.lineStyle(2, 0x333333);
            g.beginFill(0xFFFFFF, 0.5);
            g.moveTo(0, 5);
            g.lineTo(10, 5);
            g.lineTo(10, 0);
            g.lineTo(20, 10);
            g.lineTo(10, 20);
            g.lineTo(10, 15);
            g.lineTo(0, 15);
            g.lineTo(0, 5);

            //var particleBitmap:BitmapData = new BitmapData(20, 20, true, 0x00000000);
            //particleBitmap.draw(sp);
            
            _emitter = new MyEmitter(new SteadyClock(30));
            var renderer:DirectedCopyPixelsRenderer = new DirectedCopyPixelsRenderer(_canvas, sp);
            renderer.addEmitter(_emitter);
            
            stage.quality = StageQuality.LOW;
            
            addChild(new Stats());
            addEventListener(Event.ENTER_FRAME, loop);
        }
        
        private function loop(e:Event):void 
        {
            _canvas.colorTransform(_canvas.rect, COLOR_TRANSFORM);
            _emitter.point.x = stage.mouseX - 10;
            _emitter.point.y = stage.mouseY - 10;
            _emitter.step();
        }
        
    }
    
}
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.geom.Point;
import flash.geom.Matrix;
import idv.cjcat.stardust.common.actions.Age;
import idv.cjcat.stardust.common.actions.DeathLife;
import idv.cjcat.stardust.common.actions.ScaleCurve;
import idv.cjcat.stardust.common.clocks.Clock;
import idv.cjcat.stardust.common.events.EmitterEvent;
import idv.cjcat.stardust.common.initializers.Life;
import idv.cjcat.stardust.common.math.UniformRandom;
import idv.cjcat.stardust.common.particles.ParticleIterator;
import idv.cjcat.stardust.common.renderers.Renderer;
import idv.cjcat.stardust.twoD.actions.Move;
import idv.cjcat.stardust.twoD.emitters.Emitter2D;
import idv.cjcat.stardust.twoD.fields.UniformField;
import idv.cjcat.stardust.twoD.initializers.Position;
import idv.cjcat.stardust.twoD.initializers.Velocity;
import idv.cjcat.stardust.twoD.particles.Particle2D;
import idv.cjcat.stardust.twoD.zones.LazySectorZone;
import idv.cjcat.stardust.twoD.zones.SinglePoint;
import idv.cjcat.stardust.common.math.StardustMath;


class MyEmitter extends Emitter2D 
{
    public var point:SinglePoint;
    
    public function MyEmitter(clock:Clock)
    {
        super(clock)
        
        point = new SinglePoint();
        
        addInitializer(new Position(point));
        addInitializer(new Velocity(new LazySectorZone(3, 1)));
        addInitializer(new Life(new UniformRandom(50, 50)));
        
        addAction(new Move());
        addAction(new Age());
        addAction(new DeathLife());
    }
}

class DirectedCopyPixelsRenderer extends Renderer
{
    public var targetBitmapData:BitmapData;
    public var sourceDisplayObject:DisplayObject;    
    public var sourceBitmapDataList:Array = [];    
    private var point:Point;
    
    public function DirectedCopyPixelsRenderer(targetBitmapData:BitmapData = null, sourceDisplayObject:DisplayObject = null)
    {
        this.targetBitmapData = targetBitmapData;
        this.sourceDisplayObject = sourceDisplayObject;
        
        var width:int = this.sourceDisplayObject.width;
        var height:int = this.sourceDisplayObject.height;
        var baseBitmapData:BitmapData = new BitmapData(width, height, true, 0x00000000);
        baseBitmapData.draw(sourceDisplayObject);
        sourceBitmapDataList[0] = baseBitmapData;
        var matrix:Matrix = new Matrix();
        for (var i:int = 1; i < 360; i++)
        {
            var bmd:BitmapData = new BitmapData(width, height, true, 0x00000000);
            matrix.translate(-width / 2, -height / 2);
            matrix.rotate(1 * StardustMath.DEGREE_TO_RADIAN);
            matrix.translate(width / 2, height / 2);
            bmd.draw(baseBitmapData, matrix);
            sourceBitmapDataList[i] = bmd;
        }
        point = new Point(); 
    }

    override protected function render(e:EmitterEvent):void
    {
        if (!targetBitmapData) return;
        
        targetBitmapData.lock();
        var particle:Particle2D;
        var rotation:int;
        var sourceImage:BitmapData
        var iter:ParticleIterator = e.particles.getIterator();
        while (particle = iter.particle as Particle2D)
        {
            point.x = particle.x;
            point.y = particle.y;
            rotation = int(Math.atan2(particle.vy, particle.vx) * StardustMath.RADIAN_TO_DEGREE);
            if (rotation < 0) rotation += 360;
            sourceImage = sourceBitmapDataList[rotation];
            targetBitmapData.copyPixels(sourceImage, sourceImage.rect, point);
            iter.next();
        }
        targetBitmapData.unlock();
    }
}