Beautifl - Flash Gallery

Thumbnail : [Stardust] Rainbow Pixels
[Stardust] Rainbow Pixels
paq 2010-01-18 MIT License

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

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));
	}
}