ActionScript 3.0で始めるオブジェクト指向スクリプティング

第61回 StarlingフレームワークでStage3Dを試す

この記事を読むのに必要な時間:およそ 7 分

StarlingルートクラスからStageを参照する

本稿の結びとして,Quadインスタンスをステージ中央に置いてみる。Stageオブジェクトの参照は,DisplayObject.stageプロパティから得られる表1参照⁠⁠。もちろん,StageもDisplayObjectもStarlingフレームワークのクラスだ。しかし,初期化のメソッド(initialize())をつぎのように書替えただけでは足りない。

private function initialize():void {
  instance = new Quad(nUnit, nUnit, nColor);
  addChild(instance);
  // instance.x = nUnit;
  instance.x = stage.stageWidth / 2;
  // instance.y = nUnit;
  instance.y = stage.stageHeight / 2;
  instance.pivotX = instance.width / 2;
  instance.pivotY = instance.height / 2;
  addEventListener(Event.ENTER_FRAME, rotate);
}

[ムービープレビュー]を試すと,つぎのようなランタイムエラー#1009が示されてしまう。これはDisplayObject.stageプロパティの値がnullだからだ。

TypeError: Error #1009: nullのオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。

前掲スクリプト1のフレームアクションで,Starlingインスタンスをつぎのようなコンストラクタメソッドの呼出しによりつくった。すると,Starlingフレームワークの初期化が始まり,第1引数のルートクラス(MySprite)のインスタンスがつくられる。つまり,Starlingルートクラスのコンストラクタが呼び出されるということだ。ところが,このときはまだStageを頂点とするStarlingフレームワークの表示リストに,ルートクラスのインスタンスは加わっていない。

var myStarling:Starling = new Starling(MySprite, stage);

Stageの表示リストに加わる前にDisplayObject.stageプロパティを参照すれば値がnullになる。これは定義済みActionScript 3.0でも同じ約束だ。そして,対処の仕方もActionScript 3.0の原則どおりでよい。DisplayObject.addedToStageイベント(定数Event.ADDED_TO_STAGEでインスタンスがStageの表示リストに加わるのを待って,初期化のメソッド(initialize())を呼び出せばよい。その処理を加えたのが,つぎのスクリプト5だ。

スクリプト5 青い矩形のQuadインスタンスをステージの中心で回転するStarlingルートクラスの定義

// ActionScript 3.0クラス定義ファイル: MySprite.as
package  {
  import starling.display.Sprite;
  import starling.display.Quad;
  import starling.events.Event;
  public class MySprite extends Sprite{
    private var nUnit:Number = 50;
    private var nColor:uint = 0x0000FF;
    private var instance:Quad;
    public function MySprite() {
      addEventListener(Event.ADDED_TO_STAGE, initialize);
    }
    private function initialize(eventObject:Event):void {
      instance = new Quad(nUnit, nUnit, nColor);
      addChild(instance);
      instance.x = stage.stageWidth / 2;
      instance.y = stage.stageHeight / 2;
      instance.pivotX = instance.width / 2;
      instance.pivotY = instance.height / 2;
      addEventListener(Event.ENTER_FRAME, rotate);
    }
    private function rotate(eventObject:Event):void {
      instance.rotation += 0.1;
    }
  }
}

コンストラクタメソッドからいきなり初期化のメソッド(initialize())を呼び出さずに,DisplayObject.addedToStageイベントのリスナーメソッドとして登録した。すると,リスナーはインスタンスがStageの表示リストに加わったとき呼び出される。そうすれば,DisplayObject.stageプロパティは正しくStageオブジェクトを参照できる。なお,メソッドをリスナーにしたため,引数にイベントオブジェクト(eventObject)を加えた。これで,Quadインスタンスはステージ中央に置かれて,回転する図6⁠。

図6 Quadインスタンスがステージ中央に置かれて回る

図6 Quadインスタンスがステージ中央に置かれて回る

次回は,Starlingフレームワークに[ライブラリ]のビットマップからつくったインスタンスを置き,ドラッグしてみたい。マウスのイベントの扱いは,そのつぎの回でも解説することになるだろう。

ところで,本連載もついに60回を超えた。⁠初級者を対象」に始めた解説が,クラスやフレームワークを扱うまでになった。思えば遠くにきた心境だ。編集部とも相談したところ,当初の目的はほぼ達したのではないかという結論に至った。そこで,本連載は後2回あるStarlingフレームワークの解説をもって,一旦閉じることになった。ここまで読んでいただいた読者に感謝するとともに,残り2回のおつき合いをぜひお願いしたい。

今回解説した次のサンプルファイルがダウンロードできます。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書