いよいよこの集中連載も最終回となりました。今回は難易度が上がりますので、解説を読んだだけでは分からない方はサンプルソースコードをじっくり眺めて、自分なりにいじってみてください。
また、前回まではチュートリアル形式で進めさせていただきましたが、今回はチュートリアル形式で進めるにはあまりにもボリュームがありすぎるため、あらかじめ用意されたプロジェクトファイルに対しての説明という形式で進めさせていただきます。
以下より、元素材となるプロジェクトファイル一式をダウンロードしてください。
今回配布する完成版のプロジェクトファイルを見ながら、前回作成したプロジェクトファイルを完成させてください。全くのコピーでもかまいません。
自分で手を動かすことがなにより最大のプラクティスになります。もちろん、もっと良い方法を思いついたらどんどん書き換えていってかまいません。
Informationシーンの作りこみ
シーンの遷移処理
早速プロジェクトファイルを見てください。かなりクラスファイルや処理の記述が増えていて驚くかもしれません。
最終的なファイルはinformationとgalleryの子シーン、トップのシーンから見たら孫にあたるシーンを作成してあります。
ここで、informationとgalleryのシーンのクラスファイル、InformationScene.asとGalleryScene.asを見てください。
_onInit、_onGotoメソッドの記述が一切無くなり、_onLoad、_onUnloadメソッドへ移動しています。
これは、なぜでしょうか?
_onInit、_onGotoメソッドに記述したままにしてみると分かるのですが、そのままですと孫シーンの遷移時に表示がおかしくなる場合が生じます。InformationSceneの初期化処理や終了処理が実行されないケースがあるためです。
今回のサイトは直接「孫シーン」を指定する場合や、「孫シーン」から「孫シーンの親では無い子シーン」という遷移が発生します。図で説明すると以下のような遷移です。
この場合、InformationSceneの_onLoad、_onUnloadメソッドへ記述することで、孫シーンが遷移処理をする場合親であるInformationSceneの処理を経由させることができます。連載第4回にシーン遷移の際の図を掲載してありますので、そちらを参照してください。
このシーン遷移処理の動作がProgressionでシーンを利用する上での大きなポイントです。通常このような動作をさせる物を作成しようとした場合、少し考える必要が生じますが、Progressionであれば特に悩む必要も無く実装できてしまうのです。
Funcコマンドの省略形
さて、実際に孫シーンを生成している箇所を説明します。InformationScene.asの_onLoadメソッドを見てください。
まず、目に付くのは、コマンド内にfunctionを直接記述している点でしょうか。
Progressionには指定した関数を実行できるFuncというコマンドが用意されていますが、そのFuncコマンドの省略形という形でコマンドリスト内に直接functionを記述できるようになっています。
一つのクラスファイルを使いまわす
処理の内容を見ていきましょう。For文で繰り返し処理を行って、シーンの作成を行っているのがわかります。
前回まで説明した方法では、一つのシーンを作る際、個々のクラスファイルを作成していました。しかし、この方法ですと、シーンが増えるに従い、用意しなければならないクラスファイルの数も多くなってしまいます。同じようなシーンであれば、一つのクラスファイルを使いまわしたい所です。
今回は一つのシーンクラスで4つのシーンのインスタンスを作成しています。
そして各シーンに対応するボタンや設置する文章のクラスファイルをgetDefinitionByNameで文字列から生成しています。
少々力技になっていしまっている感はいなめませんが、今回はテキスト等の表示部分をスクリプトで生成せず、Flashファイルのムービークリップで作成している為、表示部部分に関しては個々のクラスファイルが必要でした。
今回は孫シーンへ遷移する為のボタンをシーン数分用意してFlashファイルのムービークリップと関連付け、クラス名に連番を振り、そのクラス名の連番から配置するムービークリップを判断させています。
子シーンの一括削除
さて、_onLoadメソッドでシーンを作成している場合、もう一度同じ_onLoadメソッドが処理されてしまうとシーンの重複登録となり、エラーとなってしまいます。
そこで、_onUnloadメソッドでシーンを削除する必要が生じます。
シーンオブジェクトはremoveAllScenesという自身の子シーンを全て削除するメソッドを持っていますので、Funcコマンド内で実行させ、子シーンを全て削除しています。
Funcコマンドの省略形はこのように直接関数を指定する事も可能です。
initObjectで値を渡す
シーンクラスのインスタンスを作成している箇所で、シーンクラスのパラメータにシーン名以外のパラメータを設定しています。
Progressionで用意されているクラスはinitObjectという初期化用のパラメータを持っています。それを利用してコンテナの参照と連番の番号を渡しています。以下InfoTextSceneのコンストラクタです。
initObjectで得た値を利用し、シーンの作成を行っています。
もちろんsetter、getterで値を受け渡す事も出来ますが、折角用意されているのですからinitObjectを利用しない手はありません。
コマンドのシリアルリストとパラレルリスト
再度InformationScene.asの_onLoadメソッドのコマンド内に登録しているfunction内を見てください。
コマンドのシリアルリスト、パラレルリストの説明は連載第2回で軽く触れましたが、上記コードはコマンド実行の応用編です。
function内でパラレルリストコマンドを作成し、実行されているコマンドに差込む事でそのパラレルリストコマンドを実行させています。
さらにパラレルリスト内のコマンドをシリアルリストに変換しています。
シリアルリスト内のコマンドを[ ]で括るとパラレルリストに、パラレルリスト内のコマンドを[ ]で括るとシリアルリストに変換されます。
今回は"各ボタンの設置は同時に行いたいのだけれど、各ボタンはパラメータを設定してから設置したい"という処理を実現させるため、このようなコマンドを作成しました。
上手くコマンドリストを扱うことにより、もっと複雑な処理フローも実現できます。
各キャストオブジェクトの動作を調整する
シーンやボタン等キャストオブジェクトの配置が終了したら、最後に各キャストオブジェクトに動きを付けてあげます。
今回はテキストが表示される際、上から下に少しスライドさせて、退出時は逆の動きをするようにしてみました。
以下は、Txt_Info1.asの_onCastAddedメソッドと_onCastRemovedメソッドの部分です。
これでInformationシーン側の説明を終了します。実はもっとクラスファイルをまとめてしまうことも可能ですが、今回は割愛します[1]。
Galleryシーンの作りこみ
PRML形式のXMLデータからシーンを生成する
さて、informationシーンで一つのクラスファイルでシーンを複数生成してみましたが、写真ギャラリーページ等、増減するコンテンツの場合、いちいちシーン内のクラスファイルを作成しなければならないのが面倒です。
しかし、Progressionには決められた書式のXMLファイルからシーンを作成するという素晴らしい機能が備わっています。
まず、GalleryScene.asの_onLoadメソッドを見てください。
LoadURLコマンドでxmlファイルを読み込んだ後、シーンを作成する部分が、以下のように1行で済んでいます (※2)。
指定した書式のXMLファイルを読み込むことによりXMLのデータからシーンを動的に作成してくれるのが、シーンオブジェクトのaddSceneFromXMLメソッドなのです。
XMLファイルの中を見てみましょう。
XMLはPRMLと呼ばれる形式で記述します。詳細はProgression公式サイトにリファレンスが掲載されていますので、そちらを参照してくさい。
<scene>
タグのnameにはシーン名をclsには追加するシーンクラスを、titleにはブラウザに表示されるタイトルを設定します。<scene>
タグ内の要素にはさらに子シーンの構造の追加や、シーン固有のデータを格納できます。
今回は<imageUrl>という画像の場所を設定しています。今回の場合であれば1項目しかないため、そのまま文字列でもかまいませんが、要素が増えた時の事を考慮し、XMLListとして格納しました。
このXMLファイルを読み込み、addSceneFromXMLメソッドを実行するだけで動的にシーンの作成が可能なのです[3]。
試しにシーンをもう一つ増やしてみましょう。以下の<scene>
タグをXMLに追加します。
パブリッシュして動作させてみてください。画像のサムネールが一つ増えています。クリックするとimage6シーンへ遷移することが分かります。