「演出は少ないけど画面遷移が膨大なFlashをつくってくれ、あと音を出したい」という案件が舞い込み、自分がアサインされました。
そこで、先日Betaが公開されたProgression4を使うことにしました。
結論:1週間程みっちりやれば、有る程度の遷移とかできるようになります。
あくまでBetaなので、今後変わる可能性もありますが、メモ程度に書き残しておきます。
manager、Scene、Castの関係
manager(Progressionクラス)
managerは画面遷移のすべてを統括。
addScene()されたSceneはすべてmanagerの管理下の置かれる。
Scene(SceneObject)
画面の大枠を担当。
この中にキャストをaddChildすることで表示を行う。
Cast(CastSprite,CastButtonなど)
表示オブジェクト。
Sceneとの関連性を持たない(直接Sceneを参照できない)
基本的にはDisplayObjectにmanagerへの参照+独自の機能を持つように拡張したクラス、という認識。
独自の機能というのは、CastButtonであればSceneIdを指定することで画面を遷移する。という感じ。
ハマリポイント
Progressionには「お作法」のようなものがあり、それを理解するまでは思い通りに作れません。どこでハマったかをメモして、今後に役立てたいです。
1.シーンイベント
これはProgressionを始めた人であれば間違いなく一番最初にはまる壁。
あれ、表示されないとか、なんで2個も表示されてんの!とかはだいたいこれな気がします。
これこそProgressionのお作法で、一番重要な部分だと思います。
理解する一番の早道は、とりあえずシーンとボタンをいくつか作ってとりあえず遷移させてみて、出力パネルを監視することだと思います。
Progressionはシーンイベントを逐一表示してくれるのですごくたすかります。
あとはMurakenさんのエントリとか、gihyoのnorthprintさんのエントリが分かりやすいです。
だいたいはMurakenさんのエントリの通り、atSceneLoadとatSceneUnloadでいけたりします。atSceneInitとatSceneGotoはたまに使います。
2.コンストラクタではmanagerを参照できない。
たとえば、以下のようなコード、エラーが出ます。
public class MyScene extends SceneObject
{
public function MyScene(){
trace(manager.root);
}
}
scene:SceneObject=new SceneObject()した段階では、まだaddSceneされてない。
そのためmanagerを参照することができない、ということだと思っています。
こういう場合は、atLoadやatInitで参照すると回避できます。
protected override function atSceneLoad():void {
addCommand(
new Trace(manager.root)
);
}
3.CastからSceneを参照
たとえば、indexSceneに配置されているindexPage(CastSprite)にsettingというプロパティを作り、他のSceneや他のCastから参照したい場合。
manager.root.page.setting
とすれば良さそうですが、うまく行きません。
いちいちキャスト(このキャストは強制型変換のこと。ややこしいですね。)してやる必要があります
上の例だとこんな感じ。
IndexPage(IndexScene(manager.root).page).setting
ここらへんはprogressionというより、AS自体ではまった所かもしれません。
4.リンクしないボタンの処理
CastButtonはすごく便利です。
自分でaddEventListenerしなくてもすでにoverrideしてありますし(重要)
だけどsceneIdプロパティが必須です。
sceneId=""
sceneId="実際に存在しないId"
とかするとエラーで怒られます。
なのでその場合は普通にCastSpriteで作ってaddEventListenerする、という従来通りの作り方をします。
managerへの参照を持たないオブジェクトの中に配置したCastはmanagerを参照できない
なにを言っているんだという感じですか、コードだとこんな感じです。
sp:Sprite=new Sprite();
cast:CastSprite=new CastSprite();
sp.addChild(cast);
とした場合、Castはマネージャーに参照できません。
spもCastSpriteにする必要があります。
rootの定義
シーンからドキュメントクラスにアクセスするときは注意が必要です。
SceneObject.root
CastSprite.root
上記は同じようにrootを参照していますが実体は違います。
SceneObjectのrootはmanager.rootと同じです。
Castのrootはindex。いわゆるドキュメントクラスです。
CastからindexSceneを参照したい場合は、manager.rootとすればよいですが、SceneObjectからドキュメントクラスを参照したい場合
Index(manager.container.root)
こんな感じで参照できます。
Progressionの便利ポイント
さんざんはまったポイントを書いてきましたが、それよりも便利な部分が多すぎる!
ということでProgressionのナイスなポイントも。
1.コード量が最小限ですむ。
ほんとうに作りたいところだけ作れます。
こーいう構造でー、こーいう遷移でー、これ読み込んでーというのがかなり直感的にできます。
2.Command
めちゃくちゃ便利です。とくにLoader周り。
とりあえず最初に読んどいて、それから表示して。みたいなことが簡単にできます。
SeriaLList万歳。
3.超協力な参照力。
だいたいmanager.rootとか、manager.currentとかすると必要なプロパティやシーン情報が取れます。
なのでとりあえずindexとか子シーンで設定系を定義しておいて、孫シーンとかでそれを参照して処理。とかってやってます。
先ほどのはまりポイント2でやったような強制型変換で強引に、というようになりがちですが、こういう強引なコードでもちゃんと取れるのはうれしい。
これから勉強したいポイント
Progressionは機能がてんこもりなフレームワークです。
1回使っただけじゃ機能を一通り試すこともできませんでした。
今後は以下の部分に注意して使ってみたいと思っています。
initObjectとResource
一応なんとなく分かってはいるつもりなんですけど、実際使ってないのでなんとも。という感じ。
ちょうどdokeさんがlevel0でエントリを書いておられました!これを読んで勉強します。
Command
serialListでばんばん直列なcommandを発行しているだけなので、あまりよろしくないですね。。
XMLまわり
ページ情報をXMLで記述できるみたいなので、今度やってみたいです。