Stardustで複数のパーティクルを動かす。
Stardustで複数のパーティクルを生成して、それぞれを回転移動させる。
emitterを作成するときに設定する、addInitializer(new Position(new SinglePoint()))のnew SinglePoint()のxとyを変更するとパーティクルの発生位置が移動する。
ステージをマウスダウンでパーティクルの動きが変化します。
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;
}
});
}
}