→第6回:何か作りたい(1):よくあるきらきらしたやつ(ソースあり)
→第5回:Classの中身(2):Emitter2Dクラス(調査中)
→第4回:Classの中身(1):Clockクラス(調査中)
→第3回:お勉強(3):パーティクルがよける…Deflectorクラスで障害物
→第2回:お勉強(2):マウスで作る、やめる…Emitter.active
→第1回:お勉強(1):とりあえず何か出来た
stardustを使ってパーティクルを作るための基本的な順番は、公式マニュアルによると
(1)Clockを作る…パーティクル発生の頻度
(2)Emitterを作ってclockをセット…エミッターって発生装置みたいなもの(?)
(3)Rendererを作る…画面表示用オブジェクト(?)
(4)Renderer.addEmitter( Emitter )でエミッターをレンダラーにセット
(5)Emitter.addInitializer( 発生場所とか発生させるspiteとか )でエミッターを初期設定
(6)Emitter.addAction( 寿命の長さとか重力とか )で実際の動きを設定
(7)Event.ENTER_FRAMEやTimerEvent.TIMERに、Emitter.step()を関連づけて表示を更新
となっている。
僕もwonderflに投稿したりしてみたいんだけど、恥ずかしくって。scriptあんま書けないし。
作りたいものだけはいっぱいあるので勉強します。
マウスの座標を追いかけるってところを作ってた時。
パーティクルの発生源( _singlepoint:SinglePoint ) をどうやってxとかyで動かしたらいいかわかんなくて、サンプルを見てたら、
Emitter( _emitter )._singlepoint.x
みたいな書き方がしてあったので真似したら動いたんだけど、
Class( Instance).property、みたいな感じで別クラスのプロパティにアクセスできるんだろうか。
その1:MainSetting.as
//MainSetting.as…表示するための初期設定クラス
package{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import idv.cjcat.stardust.common.emitters.Emitter;
import idv.cjcat.stardust.common.renderers.Renderer;
import idv.cjcat.stardust.Stardust;
import com.flashdynamix.utils.SWFProfiler;
public class MainSetting extends MovieClip
{
protected var _container:Sprite;
protected var _umbrella:Umbrella;
protected var _emitter:Emitter;
protected var _renderer:Renderer;
public function MainSetting():void
{
SWFProfiler.init( stage, this );
_container = new Sprite();
addChild( _container );
buildPerticleSystem();
}
protected function buildPerticleSystem():void {
//Main.asに継承して使用
}
protected function loop( e:Event = null ):void {
//Main.asに継承して使用
}
}
}
その2:Main.as
//Main.as…MainSettingクラスを継承して最終的に表示
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import idv.cjcat.stardust.common.clocks.ImpulseClock;
import idv.cjcat.stardust.twoD.renderers.DisplayObjectRenderer;
public class Main extends MainSetting
{
public var _clock:ImpulseClock = new ImpulseClock(6);
public function Main():void{
stage.addEventListener( MouseEvent.MOUSE_MOVE, startPerticle );
}
private function startPerticle( e:Event){
_clock.impulse();
addEventListener( Event.ENTER_FRAME, loop );
}
override protected function buildPerticleSystem():void {
_emitter=new MainEmitter( _clock );
_renderer= new DisplayObjectRenderer( _container );
_renderer.addEmitter( _emitter);
}
override protected function loop( e:Event = null ):void{
var fx:int = ( root.mouseX - MainEmitter( _emitter )._singlepoint.x) *0.1;
var fy:int = ( root.mouseY - MainEmitter( _emitter )._singlepoint.y) *0.1;
MainEmitter( _emitter )._singlepoint.x +=fx;
MainEmitter( _emitter )._singlepoint.y +=fy;
_emitter.step();
}
}
}
その3:MainEmitter.as
//MainEmitter.as…エミッターの初期設定、アクション設定
package {
import idv.cjcat.stardust.common.clocks.Clock;
import idv.cjcat.stardust.common.initializers.Alpha;
import idv.cjcat.stardust.common.initializers.Mass;
import idv.cjcat.stardust.common.initializers.Life;
import idv.cjcat.stardust.common.initializers.Scale;
import idv.cjcat.stardust.common.math.UniformRandom;
import idv.cjcat.stardust.common.actions.Age;
import idv.cjcat.stardust.common.actions.DeathLife;
import idv.cjcat.stardust.twoD.actions.Move;
import idv.cjcat.stardust.twoD.actions.Oriented;
import idv.cjcat.stardust.twoD.emitters.Emitter2D;
import idv.cjcat.stardust.twoD.fields.UniformField;
import idv.cjcat.stardust.twoD.initializers.DisplayObjectClass;
import idv.cjcat.stardust.twoD.initializers.Position;
import idv.cjcat.stardust.twoD.initializers.Velocity;
import idv.cjcat.stardust.twoD.zones.SinglePoint;
import idv.cjcat.stardust.twoD.zones.CircleZone;
public class MainEmitter extends Emitter2D {
public var _singlepoint:SinglePoint = new SinglePoint(300,150);
public function MainEmitter( clock:Clock){
super( clock );
//初期設定
addInitializer(new DisplayObjectClass(Rain));
addInitializer(new Position( _singlepoint));
addInitializer(new Velocity(new CircleZone(0, 0, 1)));
addInitializer(new Mass(new UniformRandom(1, 0.5)));
addInitializer(new Scale(new UniformRandom(1, 0.5)));
addInitializer(new Life( new UniformRandom( 60 , 10 ) ) );
addInitializer(new Alpha( new UniformRandom( 0.5, 0.5)));
//アクション
addAction(new Move());
addAction(new Oriented());
addAction(new DeathLife());
addAction(new Age() );
}
}
}
・簡単に墨汁が飛び散ったようなものを書ける筆ブラシ。
・物体が落っこちてきてボフッと巻き上がる砂塵。
・テキスト入力するとそのたびにきらりんきらりんする。
・ボタン押すと少しづつ粉上になって写真に復元するUI。
・超リアル砂時計。
・なんかマリオみたいな横スクロールで死ぬと灰燼に帰す。
・パーティクル一粒一粒で自動作曲。
・超弾幕。