Flex SDK でプリローダー

Flex SDKを使っていて、プリローダーをつけるのにどハマリしたので覚書。

まず、プリローダーをつけるには

[Frame(factoryClass="Preloader")]

みたいなメタ指定を入れるのだが、これをずっとルートファイルのコンストラクタの前に入れていた。正しくは

  [Frame(factoryClass="Preloader")]
  public class Root extends Sprite {

みたいに、クラス定義の直前に入れないといけない。

次に、プリローダーの中でロード完了時に

var mainClass:Class = Class(getDefinitionByName("Root"));
  if (mainClass) {
    var root:Sprite = new mainClass();
    addChild(root);
  }

としてRootのインスタンスを作って追加するのだが、こうするとRootのコンストラクタでstageが触れなくなる。ゲームを作るときにはstageに対してマウスやキーボードイベントのリスナを追加するので、これではとても困る。

そこで、コンストラクタではなく、ADDEDイベントにおいてstageを触る処理をやる。

こんな感じ。

public Root extends Sprite{
  addEventListener(Event.ADDED, onAdded);
}
private function onAdded(e:Event):void{
  this.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);      this.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  stage.addEventListener(MouseEvent.CLICK, onClick);
}

ちなみにビットマップ系のゲームなら、

stage.scaleMode = StageScaleMode.NO_SCALE;

を指定すると思うが、これはプリローダーのコンストラクタに入れるのが良い。