« 東京てら子ワークショップキットのIndexScene | メイン | Progression de Amazon »

2008年4月 3日

[Progression] Progressionのpreloader.flaを使ってみる

引き続きProgression Frameworkについて。
執筆時現在のバージョンは 2.0.17 です。
前回のデモのpreloader.flaに処理を追加してみました。
デモ(2008.04.03)

とりあえずpreloader.flaとクラスファイルをアップしときます。
preloaderソースファイル
Progressionのクラスは入ってないです。

クラスファイルの中身はこんなのです。
DemoPreloader.as
(余談だけど、hetemlって.asファイルをブラウザで見ることできないのかな?
.htaccessにAddType書いてみてもだめだったんだけども、なんでだろ?)


以下、今回けつまずいた箇所のメモ。

ExPreloaderを継承したDemoPreloaderクラス(以後Preloaderクラス) の onComplete の後、
IndexのonInitが発信されるが、今回complete後にアニメーションを加えた(これはindex.falに入れた
ほうが良いかもしれない)のと、ローディングのバーの伸び方にイージングを加えたので、
それが終わってから Progression のシーンが始まるようにしたかった。

そのため、IndexクラスからPreloaderクラスにイベント通知の登録をしようとして
Preloaderのインスタンスを参照しようとすると、ステージ上のオブジェクトが存在しないと怒られた。

これを回避するためにPreloaderクラス内のオブジェクトの参照をgetterを使って間接的に参照するようにした。

以下はIndexクラスに書いたPreloaderクラスへの参照の部分。
override protected function _onInit():void
{
    //~中略
    
    if( DemoPreloader.instance ){
        DemoPreloader.instance.addEventListener( Event.CLOSE , startContents );
    } else {
        startContents();
    }
}

private function startContents( event:Event=null ):void
{
    // 最初のシーンへ移動。
    prog.goto( prog.firstSceneId );
}

----

onProgressイベント内で、同クラスの bytesLoaded と bytesTotal の両プロパティを参照すればよいのかと思いきや
これらのプロパティは progress.swf 自身のバイト情報なのでロード進行中はすでにどちらも固定の値しか返してなかった。
なので addEventListener で一旦 progressイベントにリスナーを登録して、そこに渡されるイベント情報から
bytesLoaded と bytesTotal を読み取るようにした。
(ここで登録したリスナーにはきちんと内部のExLoaderの情報が返ってきてる。)

----

実際サーバーにアップしてみて気づいたのは、URLが変わって「index.html#/~」とかってなるところでリロードすると
Indexクラスの onInitイベントが飛ばされるみたい。詳細はわからないけども。
そのためローディングの後処理と、メインのコンテンツが同時に実行されてしまった。
これは Progression のルートに設定したシーンクラスの onLoad から Preloader の動作をキャンセルさせることで回避。

以下はルートシーンの onLoad イベント内の処理。
書いてることは Preloader が終了してなければスキップ。
override protected function _onLoad():void
{
    if (DemoPreloader.status != "close") DemoPreloader.status = "skip";
    
    addCommand( 
        new AddChild( progression.container , _cast )
    );
}

----

これはつまずいた訳ではないけども、ちょっと気になったのでボソっと。
toString がオーバーライドされてるからPreloaderクラスをtraceすると [object DocumentRoot] に。
DocumentRoot クラスから toString を消すと [object ExMovieClip] に。
コンマ数秒だけ「あれ?」って思った。w


なんか自分の失敗ばかりツラツラ書くと、Progression使うの難しく見えるかもしれないなあ。
でも、本当は気にするところが、上にあげた部分だけで、その他に気にすることが無いってところが良くできてるんだと思う。
だってプリローダーファイルを外部で用意して、コンテンツ部分と分離させようとか考えてイチから作ったらかなりの手間だと思う。
コンテンツ部分の制作時に親ファイルの存在を気にする必要もなく出来てる訳だし。
Progression使わずにローディングの部分だけでも使えるし。

あと、AS2やってた人がAS3の取っ掛かりにProgressionを使うのもいいと思う。

なかなか使いこなすまでには至らないけども、噛めば噛むほど味の出る感じがいいです、Progression。
きっとjp.niumパッケージの中身とかも便利クラスがいっぱい詰まってるんだろうと思いますが、
まだそこまで手が回りません。

トラックバック(0)

このブログ記事を参照しているブログ一覧: Progressionのpreloader.flaを使ってみる

このブログ記事に対するトラックバックURL: http://system.seyself.com/mt-tb.cgi/492

コメント(2)

またまた解説ありがとうございます!

現状 Preloader 周りは、まだ仕様がうろうろしている感じですが、最終的には全て同じパターンで実装できる方がスマートだと思うので、次のマイナーバージョンアップ時に Progression の addCommand() と同じ記述で作成できるように統一させようと考えています。
まだまだ開発に入っていない状態で、フォーラムでもご意見を募集していますので、何か気になる点などがあればこの機会に教えていただければ対応できるかもしれません。

開発者自身が使ってて発見があるスルメフレームワークなので、取っ付きにくい部分はありますが、今後もよろしくお願いします!

michi :

アップデート開発に、ドキュメントの作成にと、お忙しいかと思いますが
未実装の関数やクラスを見ていて、ひそかに楽しみにしています。

Progression って制作の手助けになることも、活用したい理由のひとつではありますが、
何よりオーサリングのルール付けがある程度定義されているので
他者の作成したコンテンツの解析が必要な時(修正案件のような)や、
人に制作過程で助言が必要な時など、互いに Progression のような
統一されたフォーマットを活用していれば、かなり無駄な時間を
省けるんじゃないかと思っております。

Progression にはそんな期待もあるので、
こちらこそ今後もよろしくお願いしますです。

コメントする


画像の中に見える文字を入力してください。

しばらく時間が経過すると、システム内部と表示されている文字内容に食い違いが発生するようなので、
投稿する前にページをリロードすることをお勧めします。
リロードしてもフォームの内容は維持されます。