Flashのフレームワーク「Progression3」を始めてみよう!

第5回 Progression3でWebサイトを作る(後編)

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

Funcコマンドの省略形

さて,実際に孫シーンを生成している箇所を説明します。InformationScene.asの_onLoadメソッドを見てください。

protected override function _onLoad():void 
{
  addCommand(
    // 任意のコマンドを記述してください。
    new Prop(_btn_Close, { x:700, y:0 ,sceneId:progression.root.sceneId} ), 
    new AddChild(_page, _btn_Close),
    new Prop(_page, { x:50, y:100 } ), 		
    function():void {
      //コマンド登録の為のパラレルリストの作成
      var pList:ParallelList = new ParallelList();		      //削除の為の参照を保持する配列の用意
      _arr_Btn_Info_Title = new Array();
      //子シーンは4つ作成します
      for (var i:int = 0; i < 4; i++) {
        //シーンの作成
        var infoTextScene:InfoTextScene = new InfoTextScene("information" + i, { container:_page, infoNum:i } );
        addScene(infoTextScene);
        //ボタンの作成(クラス名よりインスタンスの作成)
        var btn_Info_Title_Class:Class = Class(getDefinitionByName("myproject.buttons.Btn_Info_Title" + (i + 1)));
        var btn_Info_Title:CastButton = new btn_Info_Title_Class();
        //削除時の為の参照を保持
        _arr_Btn_Info_Title.push(btn_Info_Title);
        //ボタンに遷移先シーンIDの設定
        btn_Info_Title.sceneId = scenes[i].sceneId;
        pList.addCommand(
        //パラレルリスト内にシリアルリストの作成
          [
          new Prop(btn_Info_Title, { x:50, y:(i * 20) + 30 } ),  
          new AddChild(_page, btn_Info_Title)
          ]
        );
      }
      insertCommand(pList);
    },
    new AddChild(progression.container, _page)
  );
}

まず,目に付くのは,コマンド内にfunctionを直接記述している点でしょうか。

Progressionには指定した関数を実行できるFuncというコマンドが用意されていますが,そのFuncコマンドの省略形という形でコマンドリスト内に直接functionを記述できるようになっています。

一つのクラスファイルを使いまわす

処理の内容を見ていきましょう。For文で繰り返し処理を行って,シーンの作成を行っているのがわかります。

前回まで説明した方法では,一つのシーンを作る際,個々のクラスファイルを作成していました。しかし,この方法ですと,シーンが増えるに従い,用意しなければならないクラスファイルの数も多くなってしまいます。同じようなシーンであれば,一つのクラスファイルを使いまわしたい所です。

今回は一つのシーンクラスで4つのシーンのインスタンスを作成しています。

var infoTextScene:InfoTextScene = new InfoTextScene("information" + i, { container:_page, infoNum:i } );

そして各シーンに対応するボタンや設置する文章のクラスファイルをgetDefinitionByNameで文字列から生成しています。

var btn_Info_Title_Class:Class = Class(getDefinitionByName("myproject.buttons.Btn_Info_Title" + (i + 1)));
var btn_Info_Title:CastButton = new btn_Info_Title_Class();

少々力技になっていしまっている感はいなめませんが,今回はテキスト等の表示部分をスクリプトで生成せず,Flashファイルのムービークリップで作成している為、表示部部分に関しては個々のクラスファイルが必要でした。

今回は孫シーンへ遷移する為のボタンをシーン数分用意してFlashファイルのムービークリップと関連付け,クラス名に連番を振り,そのクラス名の連番から配置するムービークリップを判断させています。

子シーンの一括削除

さて,_onLoadメソッドでシーンを作成している場合,もう一度同じ_onLoadメソッドが処理されてしまうとシーンの重複登録となり,エラーとなってしまいます。

そこで、_onUnloadメソッドでシーンを削除する必要が生じます。

protected override function _onUnload():void 
{
  addCommand(
    // 任意のコマンドを記述してください。
    //子シーン遷移用ボタンの削除
    function ():void {
      for (var i:int = 0; i < _arr_Btn_Info_Title.length; i++) {
        insertCommand(new RemoveChild(_page, _arr_Btn_Info_Title[i]));
      }
    },
    //閉じるボタンの削除
    new RemoveChild(_page, _btn_Close),
    //ページイメージの削除
    new RemoveChild(progression.container, _page),
    //子シーンの削除
    removeAllScenes
  );
}

シーンオブジェクトはremoveAllScenesという自身の子シーンを全て削除するメソッドを持っていますので,Funcコマンド内で実行させ,子シーンを全て削除しています。

Funcコマンドの省略形はこのように直接関数を指定する事も可能です。

著者プロフィール

楢山哲弘(ならやまのりひろ)

3年前に上京してきた北海道出身のFlasher。

開発スピードを上げるため,Progressionに傾倒中。そのため,ブログではProgressionについての言及が多くなっている。

URLhttp://narayama.heteml.jp/