→第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()を関連づけて表示を更新
となっている。
2D用のエミッターを作る。
僕はCGにもパーティクルにも全く詳しくないので、正直理解してません。
エミッターというのは、おおよそ、パーティクルの発生源、フキダシ口と考えてよいでしょうか。
//設定例 var emitter:Emitter2D = new Emitter2D(clock);//引数をclockにして生成
Emitter2D.addInitializer(初期設定)
エミッター装置の初期設定をする。
初期設定できる主な値は以下の通り。
| クラス(抜粋) | 内容 |
|---|---|
| Life(Randomオブジェクト) | パーティクルの寿命の範囲 |
| Mass(Randomオブジェクト) | パーティクルの固まり具合(?)の範囲 |
| Scale(Randomオブジェクト) | パーティクルの粒の大きさの範囲 |
| Alpha(Randomオブジェクト) | パーティクルの不透明度の範囲 |
| 以下、twoD. Initializers内 | |
| DisplayObjectClass ( displayObjectClassオブジェクト) |
パーティクル自身のクラスを指定(雨粒とか点とかを作るクラス) |
| Position( zoneオブジェクト) | パーティクルの発生するエリアを指定→idv.cjcat.stardust.twoD.zones 2DのZoneクラス)CircleZone,Line,RectZone,SectorZone,SinglePoint,LazySectorZoneなど |
| Velocity( zoneオブジェクト) | パーティクルの速度(?)を指定→idv.cjcat.stardust.twoD.zones 2DのZoneクラス)CircleZone,Line,RectZone,SectorZone,SinglePoint,LazySectorZoneなど |
| Rotation( Randomオブジェクト) | パーティクルの動く角度の範囲 |
| Omega( Randomオブジェクト) | オメガって何ですか?角速度? |
・基本的に数字じゃなくてアバウトな範囲で指定する感じ。
・Randomオブジェクトは new UniformRandom( 初期値 , 範囲 )で作れるっぽい。
new UniformRandom( 5 , 5 )なら、0~10の範囲でランダムな数が作られる(と思う)。
Emitter2D.addAction(アクション)
重力や障害物(パーティクルが避けて通る)などの動きの設定をする
設定できる主なアクションは以下(ただし調査中)
多すぎてわけわからなくなりそうなので、後日整理。
| 設定できるクラス | 内容 |
|---|---|
| Age(Number) | 初期値:1。Lifeで設定した寿命に対して、消えるまでの時間(?) |
| DeathLife(しきい値:Number) | パーティクルが寿命を迎えた時に「取り除く」場合はこれを必ずONにする。 |
| AlphaCurve (inLifespan:Number = 0, outLifespan:Number = 0, inFunction:Function = null, outFunction:Function = null) |
寿命内でのパーティクルの透明度の変化具合をpenner.easingで調節できる…らしいが未検証。 |
| ScaleCurve (inLifespan:Number = 0, outLifespan:Number = 0, inFunction:Function = null, outFunction:Function = null) |
寿命内でのパーティクルのサイズの変化具合をpenner.easingで調節できる…らしいが未検証。 |
| 以下、twoD.actions内 | |
| Accelerate( acceleration:Number = 0.1 ) | パーティクルの加速度 |
| Damping( damping:Number = 0 ) | パーティクルの減速。1で停止。 |
| collide() | パーティクル同士が衝突すると互いに反発する(?)…調査中 |
| Deflect() | deflect.addDeflector( deflectorオブジェクト )で障害物を生成。 その後、Emitter2D.addAction( deflect ) でアクションに追加。 |
| Explode( x, y, strength, growSpeed, maxDistance, attenuationPower, epsilon) | 特定の座標から衝撃波を起こす(?) |
| FollowWaypoints( waypoints:Array = null, loop:Boolean = false, massless:Boolean = true) | 特定の座標をパーティクルが通過するようになる(?) |
| Gravity() | Fieldオブジェクトに対して重力をかける |
| Impulse(field:Field = null) | Fieldオブジェクトに対して加速をかける |
| Move(multiplier:Number = 1) | パーティクルの動きを増幅する。例えば2にすれば同じ速度で2回動く(?) |
| Oriented(factor:Number = 1, offset:Number = 0) | 調査中 |
| RandomDrift(maxX:Number = 0.2, maxY:Number = 0.2, randomX:Random = null, randomY:Random = null) | ランダムな加速をさせる |
| Snapshot | パーティクルのステータスを記録したり戻したり(?) |
| Spawn(count:Random = null, inheritDirection:Boolean = true, inheritVelocity:Boolean = false) | パーティクルの分裂(?)花火やロケット噴射っぽい表現に使うと書いてある。 |
| SpeedLimit(limit:Number) | パーティクルの限界速度を指定 |
| Spin(multiplier:Number = 1) | 角速度omegaに対して回転数を指定 |
多分、ほとんどパーティクルの動きはInitializeとActionで決定することになりそうなので、
覚えたら色んなことができそう。
・3Dもやってみたい。よしやってみよう。