火花だとか水しぶきなどの小さな粒がランダムに飛び散るような効果を、CGの世界では「パーティクル」と呼ぶ。これをFlashで簡単に行うエンジンはないかなーと探してたら、Stardust というものが見つかった。

台湾の学生が作ったらしいが、よく出来てる...らしい。まぁ他にも色々あるようだが、とりあえずこれを使うことにした。

しっかしこれが。現在バージョンは1.3なのだが、マニュアルが1.0のまま。サンプルコードの「Rain」もちっとも動きゃしないというシロモノだった。作者に連絡を取ったがあんまりラチが開かないので、悪戦苦闘するハメに。とりあえず解決したので同じ苦労をしている人のためにメモって置く。

  1. アーカイブには CJSignals[ver].swc が同梱しているが、CS3は対応してない(涙)。なのでCS3な人は、ここからソースを取って来て入れる
  2. rendereres は廃止になった。代わりに idv.cjcat.stardust.twoD.handlers.* が必要になったのでこれを import
  3. addEventListener() に直接 emitter.step() を渡すとCS3では動かない。関数を被せること。

以下改訂版「Rain」のソース。疲れた...。

import idv.cjcat.stardust.common.actions.*;
import idv.cjcat.stardust.common.clocks.*;
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.handlers.*;
import idv.cjcat.stardust.twoD.zones.*;

var sprite:Sprite = new Sprite();
addChild(sprite);

var emitter:Emitter2D = new Emitter2D(new SteadyClock(1));
emitter.particleHandler = new DisplayObjectHandler(sprite);

emitter.addInitializer(new DisplayObjectClass(RainDrop));
emitter.addInitializer(new Position(new Line(0, 0, 300, 0)));
emitter.addInitializer(new Velocity(new SinglePoint(0, 5)));

emitter.addAction(new DeathZone(
    new RectZone(0, 0, 300, 300), true));
emitter.addAction(new Move());

addEventListener(Event.ENTER_FRAME, loop);

function loop(e:Event):void
{
    emitter.step();
}
Gramma
この書体は Gramma — 欧文フォント買うなら MyFonts