Beautifl - Flash Gallery

Thumbnail : 20,000 particles with BetweenAS3
20,000 particles with BetweenAS3
beinteractive 2009-08-30 All rights reserved

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

package
{
	import com.flashdynamix.utils.SWFProfiler;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.PixelSnapping;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.ColorTransform;
	import flash.geom.Point;
	import org.libspark.betweenas3.BetweenAS3;
	import org.libspark.betweenas3.easing.Back;
	import org.libspark.betweenas3.easing.Quart;
	import org.libspark.betweenas3.tweens.ITween;
	
	public class ParticleBetween extends Sprite
	{
		private static const NUM_PARTICLES:uint = 20000;
		private static const FADE:ColorTransform = new ColorTransform(1, 1, 1, 1, -32, -16, -16);
		
		public function ParticleBetween()
		{
			setupParticles();
			setupScreen();
			setupStage();
			
			SWFProfiler.init(this);
			
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
		
		private var _bitmapData:BitmapData;
		private var _bitmap:Bitmap;
		private var _particles:Particle;
		
		private function setupParticles():void
		{
			var prev:Particle = _particles = new Particle();
			var p:Particle = null;
			var a:Number, dx:Number, dy:Number;
			var t:ITween;
			var i:int = NUM_PARTICLES;
			while (--i >= 0) {
				
				a = Math.random() * Math.PI * 2;
				dx = Math.cos(a) * 465 + 465 / 2;
				dy = Math.sin(a) * 465 + 465 / 2;
				
				p = new Particle();
				p.p.x = 465 / 2;
				p.p.y = 465 / 2;
				
				t = BetweenAS3.tween(p.p, {x: dx, y: dy}, null, 1.5 + Math.random() * 4.5, Quart.easeIn);
				t.stopOnComplete = false;
				t.play();
				
				prev.next = p;
				prev = p;
			}
		}
		
		private function setupScreen():void
		{
			_bitmapData = new BitmapData(465, 465, false, 0x000000);
			_bitmap = addChild(new Bitmap(_bitmapData, PixelSnapping.NEVER, false)) as Bitmap;
		}
		
		private function setupStage():void
		{
			stage.frameRate = 60;
			stage.quality = StageQuality.LOW;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			stage.addEventListener(Event.RESIZE, resizeHandler);
			resizeHandler(null);
		}
		
		private function resizeHandler(e:Event):void
		{
			_bitmap.x = Math.floor((stage.stageWidth - 465) / 2);
			_bitmap.y = Math.floor((stage.stageHeight - 465) / 2);
		}
		
		private function enterFrameHandler(e:Event):void
		{
			var bitmapData:BitmapData = _bitmapData;
			
			bitmapData.lock();
			bitmapData.colorTransform(_bitmapData.rect, FADE);
			
			var p:Particle = _particles;
			var pos:Point;
			while ((p = p.next) != null) {
				pos = p.p;
				bitmapData.setPixel(pos.x >> 0, pos.y >> 0, 0xffffff);
			}
			
			bitmapData.unlock();
		}
	}
}

import flash.geom.Point;

internal class Particle
{
	public var p:Point = new Point();
	public var next:Particle;
}