ActionScript Learning 110708-2

7.8.2011

Stardustで複数のパーティクルを動かす。

Stardustで複数のパーティクルを生成して、それぞれを回転移動させる。

emitterを作成するときに設定する、addInitializer(new Position(new SinglePoint()))のnew SinglePoint()のxとyを変更するとパーティクルの発生位置が移動する。
ステージをマウスダウンでパーティクルの動きが変化します。

SAMPLE VIEW CODE


package {
	
	
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	import flash.utils.*;
	
	import idv.cjcat.stardust.Stardust;
	import idv.cjcat.stardust.common.emitters.*;
	import idv.cjcat.stardust.common.actions.*;
	import idv.cjcat.stardust.common.clocks.*;
	import idv.cjcat.stardust.common.handlers.*;
	import idv.cjcat.stardust.common.initializers.*;
	import idv.cjcat.stardust.common.math.*;

	import idv.cjcat.stardust.twoD.actions.*;
	import idv.cjcat.stardust.twoD.emitters.*;
	import idv.cjcat.stardust.twoD.initializers.*;
	import idv.cjcat.stardust.twoD.zones.*;
	import idv.cjcat.stardust.twoD.handlers.*;
	

	
	
	public class NMain extends MovieClip {
		
		//-------------------------------------------------------------------------------- Properties

		private var _this:*;
		private var _stage:Stage;


		
		//-------------------------------------------------------------------------------- Constractor
		
		public function NMain() {
			
			_this = this;
			
			_stage = stage;
			
			_stage.scaleMode = StageScaleMode.NO_SCALE;
			_stage.align = StageAlign.TOP_LEFT;
			
			_stage.quality = "low";
			
			Init();
		}
		
		
		//-------------------------------------------------------------------------------- Function

		/**
		 * initialize
		 */
		public function Init():void {
			
			setup();
		}
		
		/**
		 * setup
		 */
		private function setup():void {
			
			setup_main();
			
			setup_particle();
			
			_this.addEventListener(Event.ENTER_FRAME, _enterframe);
			
			_stage.addEventListener(MouseEvent.MOUSE_DOWN, function(){stagemd = true;});
			_stage.addEventListener(MouseEvent.MOUSE_UP, function(){stagemd = false;});
		}
		/** */
		private function _enterframe(eo:* = null):void {
			
			particle_enterframe();
		}
		
		
		/**
		 * main
		 */
		private var _main:MovieClip;
		
		private function setup_main():void {
			
			_main = new MovieClip();
			
			_this.addChild(_main);
			
			_stage.addEventListener(Event.RESIZE, main_resize);
			main_resize();
		}
		//
		private function main_resize(eo:* = null):void {
			
			_main.x = Math.round(_stage.stageWidth / 2);
			_main.y = Math.round(_stage.stageHeight / 2);
		}
		
		
 		/**
		 * particle
		 */
		private var pntsarr:Array;
		private var emitterarr:Array;
		private var emitterlength:int;
		private var stagemd:Boolean;
		
		private function setup_particle():void {
			
			pntsarr = [];
			emitterarr = [];
			
			emitterlength = 2;
			
			for(var i = 0; i < emitterlength; i ++) {
				
				pntsarr[i] = new SinglePoint();
				
				var emitter = new Emitter2D();
				emitterarr[i] = emitter;
				
				emitter.clock = new SteadyClock(2);
				
				emitter.particleHandler = new DisplayObjectHandler(_main);		
				
				emitter.addInitializer(new DisplayObjectClass(graph));
				emitter.addInitializer(new Position(pntsarr[i]));
				emitter.addInitializer(new Life(new UniformRandom(40, 20)));
				emitter.addInitializer(new Velocity(new LazySectorZone(.8, 0)));
				emitter.addInitializer(new Rotation(new UniformRandom(0, 180)));
				
				emitter.addAction(new Age());
				emitter.addAction(new DeathLife());
				emitter.addAction(new Move());
				emitter.addAction(new ScaleCurve(10, 0));
				emitter.addAction(new AlphaCurve(0, 10));
				emitter.addAction(new Accelerate(.01));
				
			}
		}
		//
		private var anglecnt:int = 0;
		private var accelerator:Number = 0;
		
		private function particle_enterframe():void {
			
			if(stagemd) accelerator += .5;
			else accelerator -= .2;
			
			if(accelerator >= 4) accelerator = 4;
			else if(accelerator <= 0) accelerator =0;
			
			anglecnt += (4 + accelerator);
			
			var radius = 80 + accelerator * 20;

			var addangle = 360 / emitterlength;

			for(var i = 0; i < emitterlength; i ++) {
				
				var angle = anglecnt + (addangle * i);				
				if(angle > 360) angle -= 360;


				var pnt = pntsarr[i];
				
				pnt.x = radius * Math.cos(angle * (Math.PI / 180));
				pnt.y = radius * Math.sin(angle * (Math.PI / 180));
				
				var emitter = emitterarr[i];
				
				emitter.clock = new SteadyClock(2 + accelerator * 2);
				
				emitter.step();
			}
		}
		
	}
}


/**
 * graph
 */
import flash.display.*;
import flash.events.*;
import sketchbook.graphics.GraphicsHelper;
import frocessing.color.*;

class graph extends MovieClip {

	public function graph() {
		
		var gmc = new MovieClip();
		addChild(gmc);
		
		var colorhsl = new ColorHSL();
		colorhsl.s = 1;
		colorhsl.h = 360 * Math.random();
		colorhsl.l = .7;
		var col = colorhsl.value;

		var gh:GraphicsHelper = new GraphicsHelper(gmc.graphics);
		gh.beginFill(col, .5);
		gh.drawStar(0, 0, 4, 8, 4);
		gh.endFill();
		
		gmc.addEventListener(Event.ENTER_FRAME, function(){
														  gmc.alpha = Math.random();
														  
														  if(!parent) {
															  
															  visible = false;
															  gmc.removeEventListener(Event.ENTER_FRAME,  arguments.callee);
															  removeChild(gmc);
															  gmc = null;															  
														  }
														  });
	}
		
}








category : ActionScript / Flash / Frocessing / Stardust / sketchbook

Demonstrations

Feature Samples

Author

虹村 マキオウ (nizimura makiou)

猫と太極拳を愛する横浜在住のフリーランスクリエイターです。

logo

Demo and Sample

Category