Beautifl - Flash Gallery

Thumbnail : [CHECKMATE] Stardust Rainbow
[CHECKMATE] Stardust Rainbow
alumican_net 2009-09-20 MIT License

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

/**
 * Stardust Rainbow
 * 長い時間見続けると酔うという、いわくつきのFlash
 * 
 * forked from checkmate's Saqoosha challenge for amateurs
 */
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.Sprite;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import org.libspark.betweenas3.easing.Quint;
	
	[SWF(width = 465, height = 465, backgroundColor = 0x0, frameRate = 30)]
	public class StardustRainbow extends Sprite
	{
		//-------------------------------------
		//CLASS CONSTANTS
		
		private const W:uint = 465;
		private const H:uint = 465;
		
		private const SPRING:Number   = 0.96;
		private const FRICTION:Number = 0.15;
		
		private const PI:Number    = Math.PI;
		private const PI2:Number   = PI * 2;
		private const PI1_2:Number = PI * 0.5;
		
		private const ZEROS:Point    = new Point(0, 0);
		private const RECT:Rectangle = new Rectangle(0, 0, W, H);
		
		
		
		
		
		//-------------------------------------
		//VARIABLES
		
		private var _gradation:Gradation;
		private var _container:Sprite;
		private var _particles:Array;
		
		private var _blurFilter:BlurFilter;
		
		private var _canvasFront:BitmapData;
		private var _canvasBlur:BitmapData;
		
		private var _px:Number;
		private var _py:Number;
		
		private var _ox:Number;
		private var _oy:Number;
		
		private var _vx:Number;
		private var _vy:Number;
		
		static public var starShapeX:Array;
		static public var starShapeY:Array;
		
		
		
		
		
		//-------------------------------------
		//METHODS
		
		public function StardustRainbow():void 
		{
			Wonderfl.disable_capture();
			addEventListener(Event.ADDED_TO_STAGE, _initialize);
		}
		
		/**
		 * EntryPoint
		 */
		private function _initialize(e:Event):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, _initialize);
			
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.quality   = StageQuality.LOW;
			
			//虹色グラデーション
			_gradation = new Gradation(0xff0000, 0xff8000, 0xffff00, 0x00ff00, 0x00ffff, 0x0000ff, 0x8000ff);
			_gradation.setEasing(Quint.easeInOut);
			
			_container = new Sprite();
			_particles = new Array();
			
			addChild(new Bitmap( _canvasFront = new BitmapData(W, H, true, 0x0) ) ) as Bitmap;
			_canvasBlur = _canvasFront.clone();
			
			_blurFilter = new BlurFilter(48, 48, 1);
			
			_ox = _px = mouseX;
			_oy = _py = mouseY;
			_vx = _vy = 0;
			
			starShapeX = new Array(10);
			starShapeY = new Array(10);
			for (var i:uint = 0; i < 10; ++i) 
			{
				var angle:Number = (i / 10) * Math.PI * 2;
				var s:Number = (i % 2 == 0) ? 10 : 10 * 0.5;
				starShapeX[i] = s * Math.cos(angle);
				starShapeY[i] = s * Math.sin(angle);
			}
			
			addEventListener(Event.ENTER_FRAME, _update);
		}
		
		/**
		 * Updator
		 */
		private function _update(e:Event):void 
		{
			var dx:Number = mouseX - _px,
				dy:Number = mouseY - _py,
				ax:Number = dx * SPRING,
				ay:Number = dy * SPRING,
				p:Star,
				a:Number,
				i:int,
				n:int = _particles.length,
				angle:Number = Math.atan2(_vy, _vx);
			
			_vx += ax;
			_vy += ay;
			_px += _vx;
			_py += _vy;
			
			for (i = n - 1; i >= 0; --i) 
			{
				p     = _particles[i];
				p.v += p.a;
				p.x += p.v * Math.cos(p.angle);
				p.y += p.v * Math.sin(p.angle);
				
				p.rotation += p.rot;
				p.scaleX = p.scaleY += p.v * 0.01;
				
				//画面外のは削除
				if (p.x < 0 || p.x > W || p.y < 0 || p.y > H)
				{
					_container.removeChild( _particles.splice(i, 1)[0] );
				}
			}
			
			n = 20;
			for (i = 0; i < n; ++i) 
			{
				p    = new Star();
				p.x  = mouseX;
				p.y  = mouseY;
				p.a  = 1.0 + (Math.random() - 0.5) * 0.2;
				p.v = 0;
				p.rot = (Math.random() - 0.5) * 10;
				p.rotation = Math.random() * PI2;
				p.angle = angle * 2 + (i - n / 2) * 0.2 + PI1_2;
				p.createShape(_gradation.getColor(i / n));
				p.blendMode = BlendMode.ADD;
				_container.addChildAt(p, 0);
				_particles.push(p);
			}
			
			_vx *= FRICTION;
			_vy *= FRICTION;
			
			_ox  = _px;
			_oy  = _py;
			
			//drawing
			_canvasFront.lock();
			_canvasBlur.lock();
			
			_canvasFront.fillRect(RECT, 0x0);
			_canvasFront.draw(_container);
			
			_canvasBlur.copyPixels(_canvasFront, RECT, ZEROS);
			_canvasBlur.applyFilter(_canvasBlur, RECT, ZEROS, _blurFilter);
			
			_canvasFront.draw(_canvasBlur);
			
			_canvasFront.unlock();
			_canvasBlur.unlock();
		}
	}
}

import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
class Star extends Sprite
{
	public var a:Number;
	public var v:Number;
	public var angle:Number;
	public var rot:Number;
	
	public function Star():void
	{
	}
	
	public function createShape(color:uint):void
	{
		var i:uint;
		var g:Graphics = graphics;
		
		g.beginFill(color, 1);
		g.moveTo(StardustRainbow.starShapeX[0], StardustRainbow.starShapeY[0]);
		for (i = 0; i < 10; ++i) g.lineTo(StardustRainbow.starShapeX[i], StardustRainbow.starShapeY[i]);
		g.moveTo(StardustRainbow.starShapeX[0] * 0.5, StardustRainbow.starShapeY[0] * 0.5);
		for (i = 0; i < 10; ++i) g.lineTo(StardustRainbow.starShapeX[i] * 0.5, StardustRainbow.starShapeY[i] * 0.5);
		g.endFill();
	}
}

/**
 * @author saqoosha
 * @see http://wonderfl.net/code/7ed2d650b9d513edf9a499fb704c19ecb7aa4694
 */
import frocessing.color.ColorLerp;
import org.libspark.betweenas3.core.easing.IEasing;
import org.libspark.betweenas3.easing.Linear;
class Gradation
{
	private var _colors:Array;
	private var _easing:IEasing;
	
	public function Gradation(...args):void
	{
		_colors = args.concat();
		_easing = Linear.linear;
	}
	
	public function setEasing(easing:IEasing):void
	{
		_easing = easing;
	}
	
	public function getColor(position:Number):uint
	{
		position = (position < 0 ? 0 : position > 1 ? 1 : position) * (_colors.length - 1);
		var idx:int = position;
		var alpha:Number = _easing.calculate(position - idx, 0, 1, 1);
		if (alpha == 0)
		{
			return _colors[idx];
		}
		else
		{
			return ColorLerp.lerp(_colors[idx], _colors[idx + 1], alpha);
		}
	}
}