Beautifl - Flash Gallery

Thumbnail : [Stardust] RendererにcopyPixelsを使う
[Stardust] RendererにcopyPixelsを使う
paq 2010-01-27 MIT License

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

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.beginFill(0x00AAAA, 0.5);
			g.drawCircle(10, 10, 10);
			g.beginFill(0x55EEFF);
			g.drawCircle(10, 10, 5);

			var particleBitmap:BitmapData = new BitmapData(20, 20, true, 0x00000000);
			particleBitmap.draw(sp);
			
			_emitter = new MyEmitter(new SteadyClock(30));
			var renderer:CopyPixelsRenderer = new CopyPixelsRenderer(_canvas, particleBitmap);
			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.geom.Point;
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;


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 CopyPixelsRenderer extends Renderer
{
	public var targetBitmapData:BitmapData;
	public var sourceBitmapData:BitmapData;	
	private var point:Point;
	
	public function CopyPixelsRenderer(targetBitmapData:BitmapData = null, sourceBitmapData:BitmapData = null)
	{
		this.targetBitmapData = targetBitmapData;
		this.sourceBitmapData = sourceBitmapData;
		point = new Point(); 
	}

	override protected function render(e:EmitterEvent):void
	{
		if (!targetBitmapData) return;
		
		targetBitmapData.lock();
		var particle:Particle2D;
		var iter:ParticleIterator = e.particles.getIterator();
		while (particle = iter.particle as Particle2D)
		{
			point.x = particle.x;
			point.y = particle.y;
			targetBitmapData.copyPixels(sourceBitmapData, sourceBitmapData.rect, point);
			iter.next();
		}
		targetBitmapData.unlock();
	}
}