«

»

1月 19

stardustでパーティクル 01

このエントリーを含むはてなブックマークはてなブックマーク - stardustでパーティクル 01 Googleブックマークに追加 このエントリをつぶやくこのWebページのtweets

以前から気になっていた AS3のライブラリ「stardust」を試してみました。

ここからダウンロードできます。
公式ページ

・ちょっとだけメモ
ライブラリパスに stardust.swc を追加しただけでは動かなくて
同梱されている CJSignals.swc も必要。

とりあえずサンプルを2つ作ってみました。

Scale変化
サンプル1

Alpha値変化
サンプル2

次回はパーティクルの動きに変化を付けたい。

以下ソース。

サンプル1

package {
	import flash.display.*;
	import flash.events.*;
	
	import idv.cjcat.stardust.common.actions.*;
	import idv.cjcat.stardust.common.clocks.*;
	import idv.cjcat.stardust.common.emitters.*;
	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.handlers.DisplayObjectHandler;
	import idv.cjcat.stardust.twoD.initializers.*;
	import idv.cjcat.stardust.twoD.zones.*;
	
	[SWF(width=500, height=500, backgroundColor=0)]
	public class StardustSample01 extends Sprite {
		private var emitter:Emitter2D;
		
		public function StardustSample01() {
			var container:Sprite = new Sprite();
			container.x = container.y = 250;
			addChild(container);
			
			//1ステップで放出するパーティクルの量を設定。
			var clock: SteadyClock = new SteadyClock(1);
			emitter = new Emitter2D(clock);
			
			//パーティクルとして生成されるクラスを指定
			emitter.addInitializer(new DisplayObjectClass(Particle));
			//初速度の設定	LazySector(速度, 分散?)
			emitter.addInitializer(new Velocity(new LazySectorZone(5, 3)));
			//パーティクルの生存ステップ数の設定 今回は50固定。
			emitter.addInitializer(new Life(new UniformRandom(50, 0)));
			//初期Scaleの設定
			emitter.addInitializer(new Scale(new UniformRandom(1, 0.5)));
			
			//この2つを設定すると生存ステップ数が0になると消滅するようになる?
			emitter.addAction(new Age());
			emitter.addAction(new DeathLife());
			
			/*
			Scaleの推移を定義 inScale → addInitializerで設定した値 → outScale
			                       (25 step)                     (25 step)
			*/
			var curve:ScaleCurve = new ScaleCurve(25,25);
			curve.inScale = 0;
			curve.outScale = 0;
			emitter.addAction(curve);
			
			//移動を有効にする。
			emitter.addAction(new Move());
			//パーティクルを表示するDisplayObjectの設定。
			emitter.particleHandler = new DisplayObjectHandler(container);
			
			addEventListener(Event.ENTER_FRAME, loop);
		}
		
		private function loop(e:Event):void {
			//時間を1ステップ進める。
			emitter.step();
		}
	}
}

import flash.display.*;
import flash.filters.BlurFilter;
import flash.filters.GlowFilter;

class Particle extends Sprite {
	public function Particle() {
	//	blendMode = BlendMode.ADD;
		filters = [new BlurFilter(), new GlowFilter(0xFF, 1, 8, 8)];
		graphics.beginFill(0xFFFFFF);
		graphics.drawCircle(0, 0, 10);
		graphics.endFill();
	}
}

サンプル2

package {
	import flash.display.*;
	import flash.events.*;
	
	import idv.cjcat.stardust.common.actions.*;
	import idv.cjcat.stardust.common.clocks.*;
	import idv.cjcat.stardust.common.emitters.*;
	import idv.cjcat.stardust.common.initializers.*;
	import idv.cjcat.stardust.common.math.*;
	import idv.cjcat.stardust.common.particles.ParticleCollectionType;
	import idv.cjcat.stardust.twoD.actions.*;
	import idv.cjcat.stardust.twoD.emitters.*;
	import idv.cjcat.stardust.twoD.handlers.DisplayObjectHandler;
	import idv.cjcat.stardust.twoD.initializers.*;
	import idv.cjcat.stardust.twoD.zones.*;
	
	[SWF(width=500, height=500, backgroundColor=0)]
	public class StardustSample02 extends Sprite {
		private var emitter:Emitter2D;
		
		public function StardustSample02() {
			var container:Sprite = new Sprite();
			container.x = container.y = 250;
			addChild(container);
			
			//1ステップで放出するパーティクルの量を設定。
			var clock: SteadyClock = new SteadyClock(1);
			emitter = new Emitter2D(clock);
			//パーティクルとして生成されるクラスを指定
			emitter.addInitializer(new DisplayObjectClass(Particle));
			//初速度の設定	LazySector(速度, 分散?)
			emitter.addInitializer(new Velocity(new LazySectorZone(5, 3)));
			//パーティクルの生存ステップ数の設定 今回は50固定。
			emitter.addInitializer(new Life(new UniformRandom(50, 0)));
			//初期Scaleの設定
			emitter.addInitializer(new Scale(new UniformRandom(1, 0.5)));
			
			//この2つを設定すると生存ステップ数が0になると消滅するようになる?
			emitter.addAction(new Age());
			emitter.addAction(new DeathLife());
			
			/*
			alpha値の推移を定義 inAlpha → addInitializerで設定した値 → outAlpha
			                       (25 step)                     (25 step)
			*/
			var curve:AlphaCurve = new AlphaCurve(25,25);
			curve.inAlpha = 0;
			curve.outAlpha = 0;
			emitter.addAction(curve);
			
			//加速度を定義
			emitter.addAction(new Accelerate(-0.1));
			//移動を有効にする。
			emitter.addAction(new Move());
			//パーティクルを表示するDisplayObjectの設定。
			emitter.particleHandler = new DisplayObjectHandler(container);
			
			addEventListener(Event.ENTER_FRAME, loop);
		}
		
		private function loop(e:Event):void {
			//時間を1ステップ進める。
			emitter.step();
		}
	}
}

import flash.display.*;
import flash.filters.BlurFilter;
import flash.filters.GlowFilter;

class Particle extends Sprite {
	public function Particle() {
		//	blendMode = BlendMode.ADD;
		filters = [new BlurFilter(), new GlowFilter(0xFF0000, 1, 8, 8)];
		graphics.beginFill(0xFFFFFF);
		graphics.drawCircle(0, 0, 10);
		graphics.endFill();
	}
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次の HTMLタグおよび属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>