Stardustでパーティクルを表現する。
Flashのパーティクルエンジン、Stardustでパーティクルを制作する。2D、3Dのパーティクルが生成できるようだが、まずは2Dから検証する。
単純なパーティクルを発生させてみる。
パーティクルの図形はsketchbookを使用した。
なおライブラリをインポートする際はStardustのライブラリだけではなく、cjsignalsというライブラリも必要なようだ。
package {
import flash.display.*;
import flash.events.*;
import flash.geom.*;
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);
}
/** */
private function _enterframe(eo:* = null):void {
_emitter.step();
}
/**
* 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 _emitter:*;
private function setup_particle():void {
_emitter = new Emitter2D();
_emitter.clock = new SteadyClock(1);
_emitter.particleHandler = new DisplayObjectHandler(_main);
_emitter.addInitializer(new DisplayObjectClass(graph));
_emitter.addInitializer(new Position(new SinglePoint(0, 0)));
_emitter.addInitializer(new Velocity(new LazySectorZone(20, 1)));
_emitter.addInitializer(new Life(new UniformRandom(50, 10)));
_emitter.addInitializer(new Rotation(new UniformRandom(0, 180)));
_emitter.addAction(new Age());
_emitter.addAction(new DeathLife());
_emitter.addAction(new Move());
_emitter.addAction(new Damping(0.1));
_emitter.addAction(new ScaleCurve(0, 20));
}
}
}
/**
* graph
*/
import flash.display.*;
import sketchbook.graphics.GraphicsHelper;
import frocessing.color.*;
class graph extends MovieClip {
public function graph() {
var colorhsl = new ColorHSL();
colorhsl.s = .8;
colorhsl.h = 360 * Math.random();
colorhsl.l = .8;
var col = colorhsl.value;
var gh:GraphicsHelper = new GraphicsHelper(graphics);
gh.beginFill(col);
var rndnum = Math.round(Math.random() * 4);
if(rndnum == 0) {
gh.drawArc(0, 0, 40, Math.random() * 360, -90);
}
else if(rndnum == 1) {
gh.drawPie(0, 0, 40, Math.random() * 360, -90);
}
else if(rndnum == 2) {
gh.drawRing(0, 0, 40, 25, Math.random() * 360, -90);
}
else if(rndnum == 3) {
gh.drawStar(0, 0, 40, 20, Math.floor(Math.random() * 5 + 5));
}
else if(rndnum == 4) {
gh.drawRect(-20, -20, 40, 40);
}
gh.endFill();
}
}