Case study of Progression. vol.1

May 28, 2009

僕も散々使わせて頂いているProgression Frameworkですが、作り方として落ち着いている部分で多少難易度がありそうなところを書いたりしていきたいなぁと思っていたのですがなかなかできていなかったので、ちょっと一発目やっときます。

第一回目は動的シーンの生成方法です。

どういう名前のシーンが発生するか分からないとき。
例えばFlickrのAPIなどを使ってディープリンクを発行するときとか。
/photo/detail/1234567
の1234567というシーンですね。
これは全てのパターンのシーンを最初に作るわけにはいかないので、index→photo→detailまで来たタイミングで動的に1234567というシーンをその場で作成して推移します。
detailというのは通過専用にします。その代りそのタイミングで子供シーンをします。

僕はこういう時は上の例でいうと”detail”のシーンを以下のようなテンプレートを少し案件に合わせて最適化したものを使用しています。


package jp.co.undefined.progression.scenes 
{
    import jp.progression.events.SceneEvent;
    import jp.progression.scenes.SceneObject;
    
    /**
     * …
     * @author muraken (undefined Inc.)
     */

    public class DynamicParentScene extends SceneObject
    {
        private var _sceneNew:SceneObject;
        private var _sceneOld:SceneObject;
        public function DynamicParentScene(name:String
        {
            super(name);
        }
        override protected function _onLoad():void
        {
            var _destinedSceneIdString:String = progression.destinedSceneId.toString();
            var path:Array = _destinedSceneIdString.split(“/”); 
            _sceneOld = new SceneObject( path[path.length - 1]);
            addScene( _sceneOld);
            _sceneOld.addEventListener(SceneEvent.UNLOAD, _onChildUnload);
        }
        
        private function _onChildUnload(e:SceneEvent):void 
        {
            SceneObject(e.currentTarget).removeEventListener(SceneEvent.UNLOAD, _onChildUnload);
            if (sceneId.contains(progression.destinedSceneId)) {
                var _destinedSceneIdString:String = progression.destinedSceneId.toString();
                var path:Array = _destinedSceneIdString.split(“/”);
                _sceneNew = new SceneObject(path[path.length - 1]);
                addScene( _sceneNew);
                _sceneNew.addEventListener(SceneEvent.LOAD, _onChildLoad);
                _sceneNew.addEventListener(SceneEvent.UNLOAD, _onChildUnload);
            }
        }
        
        private function _onChildLoad(e:SceneEvent):void 
        {
            _sceneNew.removeEventListener(SceneEvent.LOAD, _onChildLoad);
            removeScene(_sceneOld);
            _sceneOld = _sceneNew;
        }
        override protected function _onUnload():void
        {
            removeScene( _sceneOld );
            _sceneOld = null;
            _sceneNew = null;
        }
    }
    
}

そんなに長いコードではないので見てもらえれば、大体分かると思います。
/photo/detail/1234567
から
/photo/detail/4444444
に行く時もこのままで大丈夫です。

んぁー説明下手だなぁ。すみません。。

1 Comment »

  1. こんにちは。いつもブログ見てます(勝手にリンクもさせて頂いてます…)。
    このProgressionですが、今、色々と情報を集めています。
    ちょっぴり使ってみたい気もするのですが、僕のような素人が使っても大丈夫なのか不安です。
    PHPなどの知識は独学で蓄えているのですが、Flashは独学じゃ無理…と感じています。
    「ズベコベ言わずに使ってみる」のが1番なのでしょうか…?

    こんなコメントで申し訳ありません…。

    Comment by dai — June 2, 2009 @ 12:40 am

RSS feed for comments on this post. TrackBack URI

Leave a comment

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2012 Muraken.biz | powered by WordPress with Barecity