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;
を指定すると思うが、これはプリローダーのコンストラクタに入れるのが良い。