[ Progression3 ]

日曜はワイフとマイソンが遊びに出かけたので、これまでの処理を再度見直してみる。
これまでウニャウニャにしてた部分は
SceneEvent.SCENE_QUERY
のイベントに絡んだコマンド処理の部分。

Query変化時のProgressionのステータスとしては
1)progression.running==true
2)progression.running==false (既にそのシーンにいる)
の2パターンが存在

1)の場合はloadイベント後にSceneEvent.SCENE_QUERYが発動するのでSceneObjectにaddCommandしてやれば特に気にすることは無い。
問題は2)の場合、SceneObjectのコマンドで制御できないので、独自にSerialListで管理するわけになるのだけど、その際の_onGoto時との連動部分。

簡単に言うと、常にコマンドは別で用意したSerialListで管理して、それをProgressionの状態によって、SceneObjectに追加するか、executeさせるかを切り分け。_onGoto時には、そのSerialListをinterruptしてリセットという処理をSceneObjectのコマンドに追加。

ってな感じでシンプルに制御できた。

これまでSceneObjectのコマンドと、SceneEventに絡まないCommandを別管理してややこしいことになっていたのだけど、この辺がかなりスリムになってスクリプト的に見通しもよくなったし、動作も軽快になった。

やっぱ日々の業務に追われない時間の中での作業時間って必要だ。

#Progression4でその辺どうなってるのか、知らないけど・・・(ゴメンナサイ

[ Progression3 ]

先日のエントリー(AS3での埋め込みフォントの共有について:其の伍[RSLの先読み対応 with Progression](多分解決))の中で書いた、「2)ProgressionでRSLを配置するとCastDocumentの"_onInit"がロストしてしまう。」の件について少し調べてみました。前回のエントリーでは

loaderInfoの"Event.COMPLETE"がRSLが存在すると発動しないというのが起因しているかと思います。
ってさらっと書きましたが、一応順を追って書いておきます。

"CastDocument._onIinit"は"ExDocument._initialize"内でdispachされて発動されます。"ExDocument._initialize"の発動は、"ExDocument"内の4つのフラグ"_initialized","_loaderInited","_loaderCompleted","_addedToStaged"が

を満たした場合に実行されます。 で、RSLを配置しない場合は
な感じで"_onInit"がcallされます。

一方RSLを配置した場合は

のなります。問題になっているのは3番目の変数"loaderCompleted"であって、これは"ExDocument.loaderInfo"の"Event.COMPLETE"によって切り替わるフラグになります。

つまり"CastDocument.loaderInfo"の"Event.COMPLETE"が発動しない。というのが先の

loaderInfoの"Event.COMPLETE"がRSLが存在すると発動しないというのが起因しているかと思います。
この一文の意味するところです。

RSLを配置していると何故に"CastDocument.loaderInfo"の"Event.COMPLETE"が発動しないのか?そこさえクリアすれば動作するのですが、RSLの情報にどーやってアクセスすんだ?ってことろが未だ分からず途方に暮れております。

read more"ProgressionでRSLを配置するとCastDocumentの"_onInit"がロストしてしまう件" »

[ Progression3 ]

先日Progressionがバージョンアップした(blog.progression.jp» ブログアーカイブ » [リリース] Progression 3.1.2 をリリースしました)それに伴い、SWFObjectが2にバージョンアップ。それに伴いJS関係が色々変更。
今進めている案件はJSONを組み込んだりとJSを結構弄ってしまっていたので、Class関係だけを更新してJSは前のままにしたら、SWFAddressが動作しなくなってしまった(汗

ということでJS系の更新を試みたのだけど、外部ファイル参照起点設定のbase="."が上手く認識されないのか、起点がindex.htmlになってしまっているっぽく、外部ファイルの参照ができなくなってしまった。

ということでバージョンアップの手順を実際にやりながら書いていく。
(検証しながら色々やっていると自分でどこまで潰したか分からなくなるので・・・)

まず、オデの良く使うフォルダ構造は

/root
 index.html
 /swf
  preloader.swf
  index.swf
 /data
  hoge.xml

っつーような構造で、参照起点をindex.htmlではなく、/swfにする。これはまぁhtmlから読み込んだ際にも、Flashのパブリックプレビューからでも同じように外部ファイルにアクセスして動作するようにしたいということです。(じゃないと正直開発できない。)(index.htmlと同じ階層にSWFを配置すれば問題は無いのだけど、ルートに色々ファイルがあるのは個人的に好みではないというだけ・・)

じゃあまずFlash単体で動作するようにしてみようちうことで、IndexSceneの中でTopちうCastSprite拡張のクラスをAddChildして、その中で外部XML(hoge.xml)を読み込んでみる。

ま、特に悩むことはない。簡単に書く

index.flaをパブリッシュプレビューすれば問題なく読み込める。

次にswf/preloader.swfswf/index.swfを読み込み、その中からxml/hoge.xmlを読み込んでみる。いや、別に特別なことは何も無い、Preloader.asのコンストラクタは

ですが、swf基点からの読み込みなので、特に変更せずとも読み込める。
(ただuseSWFBasePath ってのがイマイチどのswfまで継承されるのか良くわからないけど・・)

ということで、一度HTMLを経由して表示してみる。

read more"baseが上手く適応されない件(Progression3.1.2)" »

[ Flash, Progression3 ]

Flashには幾つかundocumented functionが存在するのだけど、そのうちの一つ"addFrameScript"。
存在は知っていたのだけど、今まで上手く動作せず、どーしたもんかしら?と放置していた。ちと今回どうしても使いたくなってきたので改めてClassを見てみたらこんな感じだった。

// NON-DOCUMENTED (MANUAL ADDITION)
/**
* Attach a callback method to a frame. Note that this will replace any timeline code or
* previously attached callback.
* The callback method should not expect any parameter.
* @param frame Target frame number (starting from 0).
* @param notify Callback method to attach.
*/
public function addFrameScript(frame:uint, notify:Function):void;

やー (starting from 0).だった。これだけで長い間放置していた・・・汗

ちなみに複数フレームに一気に追加する場合には

削除する場合には

となります。
ちなみにflashguruでは

というような記述がありますが、これは動作確認取れませんでした。


ちなみにProgressionの"ExMovieClip"クラスではループ再生制御のためにコンストラクタで

されているので、ループさせる場合等には1フレーム程多目にフレームを定義しておかないとフレームアクションが上書きされてしまいます。


Ref.FlashGuru Consulting - Undocumented Actionscript 3

[ Progression3 ]

Progression™
リニューアルされました。
これに伴いドキュメントのURLも変更されました。(突然見れなくなって泣きそうになった)
All Packages - Progression 3.0 - API Reference

リニューアルに際して、恐れ多くもメッセージを送らせていただきました。
んが、ちょっと一人だけ浮いている気がします。ゴメンナサイ。
(仮面ライダーファンなら分かってくれると思いますが・・・)

[ Progression3 ]

今回は正確に言うと検証ではなく、改造です・・・。
今後のバージョンアップ等を考えると同期が取れなくなるのでお勧めしません。実装される方は一応自己責任でお願いします。

ドキュメントには掲載されていないのですが、
jp.progression.core.managers.HistoryManager
という履歴を管理するクラスがあります。基本的にはブラウザの「戻る」「進む」ボタンに対応してシーンを遷移させる働きをしています。これを使用しているクラスとしては
jp.progression.core.managers.KeyboardManager
jp.progression.core.managers.SceneManager
jp.progression.core.ui.CastObjectContextMenu

の3つがあります。コンテキストとかは標準的に表に出てくるので使っている人も多いと思います。

で、これと同じ働きをする「back」「next」ボタンをFlash内で実装する場合

という感じになります。

ただ履歴とその中における現在の位置の関係が分からないため、これ以上戻れない、進めない状態になったときにボタンを殺したりすることができません。(その口を見つけられていないだけかもしれないけど)

つまりHistoryManager._positionとHistoryManager._histories.lengthの関係をチェックして、フロントのボタンの制御を行える口を用意したいなと・・。
ただposition、histories共にprivate static属性のためextendsもできず・・・ということでHistoryManagerに2つメソッドを追加してしまいました。

read more"progression検証 #20 HistoryManagerの拡張" »

[ Progression3 ]

ちとはまったのでメモ。

swfの最小表示領域を確保したい場合にSWFForceSizeを使用するのですが、それがIEで上手く動作しなくてフガフガしてた。現象としては
・設定ウインドウサイズになってもスクロールバーが表示されない
・最初に小さいウインドウで表示させた後に、ウインドウを拡大してもFlashサイズが変わらない。
・縦サイズのみスクロールバーが表示され、横方向は表示されない。
等、上手く動作するときもあれば、上記のようなバラバラの挙動を示していた。

SWFObject2.0でSWFForceSizeを使う | FlashやWebにまつわるいろいろなことが原因かな?とも思ったのだけど、ちと違う。そもそもSWFForceSize.onResizeDivが発動していない。

Progression.jsの中を確認してみると"/contents/objects/version.swf"を用いてバージョンチェックを行って、progression.onLoadを実行。その中でswfObject,SWFForceSizeを定義するってのがデフォルトの流れ。

SWFForceSize内部では定義時に

をセットして初期化を行うようにしている。

んがprogression.onLoadの発動タイミングによって、document.onload後にSWFForceSizeが定義される可能性があり、そこが多分不具合の原因なのではないだろうか?と思う。(違ったらごめん)

単純に考えて"prog.onLoad"の一番最後にdocument.onLoad()を強制的にCALLしてやれば上手く動くかな?と思ったのだけど、横方向のスクロール制御が不能になったりしたので断念。

外部JSの読み込みのタイミング等に依存しているのか上手く動いたり動かなかったりという不安定な挙動をしめすので一度Progression.jsをはずした形で実装を進めてみることにする。

落ち着いたらも少し調べてみる。

[ Progression3 ]

apeirophobia: Loaderの読み込み強制終了 Loader.close編apeirophobia: Loaderの読み込み強制終了 Loader.unload編の続き。Progression3でやるとどうなるか?の検証。

主要なコードは以下の通り。本当はもっとスマートな書き方がCastImageLoaderにはありますが、敢えてここはcontentsLoaderInfoと比較するためにこの記述の仕方で・・。
CODE:1

で、一点注意点としてはCastEventは"UNLOAD"イベントを持たないので、その部分だけはEvent.UNLOADを使用します。あ、あとcontentLoaderInfoではなく直接CastImageLoaderを監視します。

プレビュー/ダウンロードシミュレートでの実行結果は

1:読み込み中にclose実行>読み込みは中断されず、COMPLETEイベント発生。ただし_loaderは表示されない。
2:読み込み前にclose実行>特に問題なし
3:読み込み後にclose実行>_loader消去
4:読み込み中にclose実行後、再度読み込み>2回目の読み込みCOMPLETEイベントが発生するが、_loaderが表示されない。
5:読み込み完了後にclose実行後、再度読み込み>問題なく表示
6:読み込み後、再度読み込み中にclose実行>unloadが無視され、COMPLETE発生後表示されてしまう。

という感じに。読み込みは中断されずCOMPLETEイベントは発生してしまいますが、表示されることはありません。

ただし4、5、6あたりが挙動が不審なところで、読み込み中にunloadを実行する、もしくは一度unlaod無しでCOMPLETEしてしまうとcontents(DisplayObject)の制御が利かなくなるようです。(ExLoader、ExImageLoader、CastImageLoaderの中を見てみましたが、ちょっと原因良く分からなかった)

HTTP経由での実行結果は

1:読み込み中にclose実行>読み込み中断。
2:読み込み前にclose実行>特に問題なし
3:読み込み後にclose実行>_loader消去
4:読み込み中にclose実行後、再度読み込み>問題なし
5:読み込み完了後にclose実行後、再度読み込み>問題なく表示
6:読み込み後、再度読み込み中にclose実行>問題なし

という結果になりました。プレビュー環境でおかしかった4、5、6辺りはHTTP経由では問題ないようです。

で、話はちょっと横にそれますが、contentsLoaderInfoのイベントとのタイミングですが、普通にLoadingした場合

CastImageLoader::ロード開始
contentLoaderInfo::ロード開始
CastImageLoader::ロード完了
contentLoaderInfo::ロード完了

というようにCastImageLoaderのイベントのほうが先に実行されています。ステキです。

では続いて、CastImageLoaderに最適と思われる記述の仕方をしてみます。

read more"progression検証 #18 CastImageLoaderの読み込み強制終了 CastImageLoader.close編" »

[ Progression3 ]

ProgressionはSWFAddressを内包しており、URLハッシュの制御が可能です。
また同様にSWFAddressの持っているページタイトルの制御もSceneObjectレベルで可能です。
(ただしブラウザ同期機能を有効にしておく必要があります)

やり方は簡単でSceneObjectの中で"title"を設定してやるだけで、そのシーンに移動した際にページタイトルが変更されます。
何も設定しない場合には各シーンのsceneIdが"|"区切りで表示されます。
インデックスシーンにのみ設定を行った場合には、そのタイトルの後ろにsceneIdが"|"区切りで表示されます。

注目すべき部分としてはシーンイベントの発生のタイミングではなく、"title"の変更を監視していて、titleの変更に対して随時ページタイトルを更新するという点です。

つまり"SceneObject"の中で複数のページタイトルを持たせることも可能と言うことになります。
(ただURLは別の話になるので、その行為にどれほどの意味があるのか微妙ですけど)
こんな感じ(※CastSprite等の中から)

titleのベース部分と、シーンタイトルを別で制御できたりするのか?はちょっとまだ良く分からないですが、まぁシーン設計の際にキチンとsceneIdが定義できていればtitleを設定しなくても問題ないかも知れません。(ただし日本語のタイトルはsceneIdに日本語を使ったことが無いので分からないですが・・・)

なんにしてもやりたいことの細かい部分まで行き届いていて、感心しきりです。

[ Progression3 ]

一日遅れですが
blog.progression.jp» ブログアーカイブ » [お知らせ] 緊急アップデートのお願い
だそうです。なにやらセキュリティに関する部分のアップデートということです。

このアップデートで修正される問題は、3.0.0 Beta 1 から 3.0.6 までの全てのバージョンが対象となっております。
過去、該当バージョンにて制作されたコンテンツに関しても、お手数ですがプロジェクトパネルの自動アップデート機能をご利用いただき、最新の状態となるように修正作業をお願い致します。

これはちょっと具体的な修正箇所を公開は難しそうです。
詳細は個別にメールでと言うことですが、これは大変だ・・・・汗

GNU系プロジェクトこういうときに本来の持ち味である公開性が使えなくって個人に負荷が集中してしまうのが辛いところ。やっぱなんかビジネスとして展開しないと作者さんが疲労してしまいそうで心配です。

AdobeCS4のアップデートで20万近くかかりますが、心情的にはProgressionにも20万ぐらい払いたい気持ちです。

ということでアップデートしてみます。

[ Progression3 ]

Progressionの便利機能の一つに

sync : Boolean
ブラウザ上でコンテンツを実行している場合に、URL と Progression インスタンスのシーンを同期させるかどうかを取得または設定します。 同一コンテンツ上で有効化できる Progression インスタンスは 1 つのみであり、複数に対して有効化を試みた場合、最後に有効化された Progression インスタンス以外の sync プロパティは自動的に false に設定されます。

があるわけですが、"Index(CastDocument)"クラス内でコマンドを使って外部ファイルのローディング処理等をしつつ、"sync=true"にしていると、コマンド処理待ちをすっ飛ばして自動的にfirstSceneIdシーンに遷移してしまいます。(prog.goto( prog.firstSceneId );"を記述していない場合、プレビュー環境では遷移しないのですがブラウザ上でみると遷移しちゃう)

各シーン毎に必要なものを読み込む様な形であれば問題ないのですが、先読みデータ前提で各シーンの設定していると(例えば外部イメージをbitmapdataとして保持して、そこから呼び出したり)、読み込み前のためにnullになってしまってエラーが出てきます。

でわどするか?っつーと"prog.sync = false;"の設定をコマンドの中にいれて設定を同期させてしまいます。つまり先読み処理が終わった後、且つ最初のシーンへの移動の間で設定する。こんな感じ
CODE-1

これで多分大丈夫。 多分・・。

[ Progression3 ]

minomix blog » ProgressionのテンプレートファイルをFlashDevelopに組み込んでみた

これは便利でちゅ。

[ Progression3 ]

このエントリーは日記です。

いやー調子にのってCastSpriteを激しく入れ子にしたものを作って、SceneObjectの"_onUnload"から"RemoveChild"で引っ掛けて、その子、孫、ひ孫へと"_onCastRemoved"で連鎖させていったらコマンドの発動順番が訳分からなくなった。これはあんまネストさせないで、深度を同じとかにして管理しないと把握できないなぁ・・・。

なんかよく分からないのは、

ICastObject オブジェクトが RemoveChild コマンド、または RemoveAllChild コマンド経由でディスプレイリストから削除された場合に送出されます。 このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。

してないCastSpriteも"_onCastRemoved"を呼び出されていること・・・。
親のCastSpriteがremoveChildされたら自動的にRemoveAllChildrenが実行されたりするのだろうか?

まぁちょっと今の構造はややこしすぎて自分でも分からないのでもう一度組みなおして整理する。

[ Progression3 ]

progression.jp | 開発 | リリースノート | 3.0.6

新しいバージョンがリリースされました。

で、アップデートしてみました。
自分の環境は
・Flash 用標準パッケージ(日本語版)
・FlashDevelop
という感じなので、mxpを更新インストールして、Flashを起動。
Progressionプロジェクトパネルの「アップデート」ボタンをクリックして、更新したいプロジェクトフォルダを選択してアップデート。

自動的にプロジェクトフォルダの中に含まれる(src以下なのか?はちょっと分からなかったですが)FLAファイルが自動的に開かれてアップデートされていきます。で、更新完了。

で、コンパイルしてみると、エラーが出てしまった。

ちとこれまだどこに原因があるのか分かっていませんけど、分かったら追記しておきます。

read more"Progression 3.0.6 をリリース" »

[ Progression3 ]

なんだかまさに付箋状態になりつつある"Progression3"カテゴリ・・・。
ということでもう一つ追加。

外部からイメージを読み込むのに使うクラス"CastImageLoader"。これは"flash.display.Loader"のサブクラスなので"LoadChild(←flash.events.EventDispatcher)"と違ってコマンドで処理待ちしてくれない。
これをコマンドで監視できるようにするのはどーすればよいか?というお話。
"Command"クラスを継承して"CastEvent.CAST_LOAD_COMPLETE"でイベントを排出したり、"executeComplete();"したりすればなんかいけそうな気もするが、ちょっとそれは冗長な気がする。

"Func"クラスを用いて、ごにょごにょしたりしてコマンド監視下に置けないかしら?
"after"メソッドの中でゴニャゴニャしてもいけそうな気もするが、今頭がまわらないので忘れないようにメモ。

read more"progression検証 #15 CastImageLoaderをコマンドで監視編" »

[ Progression3 ]

例えば"/index/food"というシーンがあって、その子供に"/index/food/curry"、"/index/aho/rice"というシーンがあるとする。

で、"/index/food"のシーンではデフォルトで自動的に"/index/food/curry"を表示するようなつくりにする場合。つまりfoodシーン自体は要素を持たない形而上的な存在で、任意(もしくはランダム)で子供シーンを表示する。という場合にSceneID="/index/food"が設定されたCastButtonを動作させないようにすることはできるか?

ということを、元々そういうプロパティがあるのか?も含めて検証してみる。
ちなみにCastButtonやSceneObject等が持っている"group"はそういう用途に使ってもよいのか?まだ良く分かっていない。(実際何に使うべきプロパティなのかイマイチ理解できてない、多分一括消去とかだとは思うんだけど・・違うかな?)

まぁ"progression.current"とかを使えば力業でできなくも無い。

[ Progression3 ]

ProgressionのBackgroundクラスにどう取り扱ってよいのか迷い中。
Progressionクラスを初期化すると自動的に追加されるインスタンスなのだけど、"container"と違って、progressionに参照プロパティが無い。で、

Progression インスタンスに関連付けられた汎用的に使用可能な表示オブジェクトを提供します。

と言うことで、ライブラリに実際に"jp.progression.core.casts.Background"クラスでMovieClipオブジェクトを関連付けるような使い方になる。

一応Background - Progression 3.0 - API Referenceな感じで色々メソッドとかあるんだけど、実際これどこからアクセスしてよいのか見当がつかない。(progression.stageにもprogression.rootにもなさそうだけど、そもそもnameもidも定義されているのか?がよく分からない・・)

何か根本的なことを見落としているような気もするのだが・・・。なんだろう??

read more"progression検証 #13Background編" »

[ Progression3 ]

複数の外部ファイルを先読みしてからコンテンツをスタートさせたい場合、Progression3でどうするか?の検証。複数外部ファイルの読み込みのクラスは幾つかあるのですが、(muraken/GroupLoader - Spark projectbulk-loader - Google Codemasapi - Google Codequeueloader-as3 - Google Code)、今回はProgressionのCommandと連動して処理するような形のものを作ってみようかと・・・。

で、まずCommandクラス部分から解析のところで悪戦苦闘中・・・。
はぅ・・・涙
今日中に何とかしたいと思います。
上手くいったら追記します(汗

[ Progression3 ]

これまでで、外部XML、画像の読み込みができるようになりました。今回は一旦立ち止り、"LoadURL","CastImageLoader"等のエラー処理について検証。

まずxmlから。以前に書いたものを整理すると
#CODE-1

これに、基本的な各種イベント監視の追加と、"LoadURL.error"を追加。 #CODE-2
この状態で"URLRequest"のURL値を存在しないファイルにすると、以下のエラーが出ます。

read more"progression検証 #11外部データの読み込み、その他の処理編" »

[ Progression3 ]

progression検証 #9 外部データ(xml)の読み込みIndex(CastDocument)編の続き。Index(CastDocument)内での初期化作業で外部xmlの読み込みまではできるようになりました。次に画像系の先読みを初期化で行ってみようと思います。(例えば背景イメージの先読み等)

先のエントリーの最後に「CastImageLoaderとLoadChildのどちらを使うか?」を悩んでいましたが、まだ明確にどちらが良いのか?は分かっていませんが、とりあえず "CastImageLoader"を使って進んでいきます。先エントリのIndex._onInitの中に以下のように追記していきます。
#CODE-1

という感じになりました。 "_bgLoader.load"の実行がこの形が適切なのか分かりませんけど、この命令の後の"new Trace("#step-1")"は"bgLoader"の読み込みを待たずに発動してしまうので、シーン移動のコマンド"new Goto(prog.firstSceneId)"を"bgLoader"の"CastEvent.CAST_LOAD_COMPLETE"イベントの中に入れています。今は他の処理のことも考えてaddCommandの中に入れていますが、いれずに"prog.goto(prog.firstSceneId);"でもOK。

複数ファイルを読み込んだりする場合は、それらを管理するクラスを作って処理した方が良さそうですが、とりあえずこんな感じで・・・・。あっているのだろうか??

あとは"bgLoader"を貼り付けている先
"prog.container.addChild(_bgLoader);"
にしているのだけど、本当は"jp.progression.core.casts.Background"に貼り付けたいのだが、アクセス方法が良く分からない・・・。これどこにあるんだろう?

Progression インスタンスに関連付けられた汎用的に使用可能な表示オブジェクトを提供します。

と書かれているが、"Container"は"progression.container"があるけど・・・。

read more"progression検証 #10 外部データ(jpg)の読み込みIndex(CastDocument)編" »

[ Progression3 ]

前回(progression検証 #8 外部データをpreloaderで読み込むのをやめて挫折中)の挫折から、みなさまからアドバイス頂いて、Index(CastDocument)で読み込んでみます。

"CastDocument"クラスには一応"addCommand"があるのですがうまく動かないので(理由は良く分からない)、むらけんさんに教えてもらった形で、コマンドリストクラス"SerialList"で設定してみます。


オデは外部リンク、外部ファイル等のURL等をconfig.xmlの中で管理しているので、それを初期化の中で読み込むようにしてみます。("Conf"と言うのは設定情報管理を行うオリジナルクラスです。)"Index"クラスの"_onInit"の中に以下のように書いてみます。
#code-1

動作としては"config.xml"の読み込みが完了してから最初のシーンに移動するという感じです。これでIndexクラスでの初期化作業も出来そうです。(実際にはLoadURLのエラー処理、loading状況の情報取得等色々入れないといけないですが・・) ありがとうございました!

ADJ:2008/11/01 1:14
すいません、上記の部分環境を家に変えて実行したら"new Conf(this.data);"の部分で

[ERROR] コマンドで ReferenceError エラーが発生。
[ERROR] コマンドで ReferenceError エラーが発生。

になりました。Commandに入れていたのか記憶が定かじゃないですが、"new Conf(config.data);"が正しい記述になります。(多分w)
ということで上記コード修正しておきました。

read more"progression検証 #9 外部データ(xml)の読み込みIndex(CastDocument)編" »

[ Progression3 ]

前エントリー(apeirophobia: progression検証 #7 外部データをpreloaderで読み込んでみる(XML編))で、Preloaderで諸々初期設定等の外部ファイルを読み込んでまとめてloading処理してしまおうと考えていたのですが、実装的(標準ではindex.swfのloadingのみに対応)、制作フロー(indexをオーサリングしているとき、外部データが無いのでpreloadからコンパイルして動作確認を取らないといけない)的にも、あまり効率的ではないと判断して、index.swfの中で初期化フローを持つ方向にシフトしようと思います。

read more"progression検証 #8 外部データをpreloaderで読み込むのをやめて挫折中" »

[ Progression3 ]

エラー処理などは放り出して、先に進みます。前回のエントリーではIndexSceneで外部XMLを読み込みましたが、最初のLoading時に設定系外部XMLやらを読み込む事例は多いかと思いますので、次はPreloaderで外部ファイルを読み込んで、SceneObject等からそのデータにアクセスするのはどーすればよいのか試してみます。

まず前検証でIndexSceneに設定した外部XMLの読み込みをPreloaderに移植します。
#code-1

こんな感じでOK。 実行すると外部XMLの読み込みが終わってからIndexが展開されます。ステキ。


read more"progression検証 #7 外部データをpreloaderで読み込んでみる(XML編)" »

[ Progression3 ]

この問題(apeirophobia: Progressionの中でPV3D)がまだクリアになっていないのだけど、ちょっと先に進みます。今回は外部データの読み込みを試してみます。

一般的に外部データとして想定されるものはxml,json,jpg,swf等があります。as3になってバイナリも読み込めるのですがそれはまた別の話で。

最初に至極まっとうにXMLでやってみます。IndexScene.asの_onLoadの中に組み込んでみます。
#code-1

こんな感じ。 次にcommandを使ってみる。

read more"progression検証 #6 外部データを読み込んでみる(XML編)" »

[ Progression3 ]

を今やっていたりするのだけど、何故だかオーサリングプレビューではpreloader経由でも表示されるのに、HTML経由だと表示されない。一応index.swfは読み込まれているのだけど、PV3D部分が表示されない。HTMLからindex.swfを直接読むようにしても表示されない。
ただProgressionを使わず直接PV3Dを展開すると表示される。
上手くSceneが制御できてないのかしら??
なんかものすごく初歩的なミスのような気がするが、頭が回らない。

ムフー。
寝る。


[ Progression3 ]

Flash系のお話は休憩して、HTML系のお話。
progressionプロジェクトではサーバにアップするデータは"deploy"フォルダにまとめられています。構造は

index.html
corssdomain.xml
index.swf
preload.swf
└/contents
 ├/images/(デフォルトではFlash Playerのバナー)
 ├/objects/(version.swfのみ)
 ├/scripts/(swfAddress,swfobject,swfforcesize,progression.js)
 └/styles/(default.css)

という形になっています。
swf系は"swf"と言うディレクトリにまとめたい性格なので、変更してみます。

まず、"swf"フォルダを作り、その中に"index.swf","preloader.swf"を移動します。
次に"index.html"の中の"swf"参照先を変更します。

に変更。 Flaファイル"index.fla"、"preloader.fla"の書き出し先を"/swf"以下に設定。 この時点で"preloader.fla"をパブリッシュするとプレビューでは"index.swf"をloadしてくれる。ただし、"index.html"からでは"index.swf"はLoadされない。これは"swf"の基点がhtmlベースになっているため。でオデは普通swfObjectに"so.addParam( "base", "." );"という一文を追加して、swf基点に書き換えてしまうので、とりあえずそれをやってみた結果は、 サーバ上:正常動作。 ローカル:"index.swf"が読み込まれない。 というちょっとアレ?な結果。

で、"Preloader.as"のコンストラクタに"useSWFBasePath = false;"という設定がある。
このuseSWFBasePath は

url プロパティの値に相対パスを使用した際に、SWF ファイルの設置されているフォルダを基準とするかどうかを取得または設定します。 ただし、読み込み処理が開始された以降は設定を変更することはできません。

ということらしい。"base"と同じような働きをするような感じ・・。
ということでこれを使ってみる。

read more"progression検証 #5 フォルダ構成を変えてみる" »

[ Progression3 ]

続いてSceneに色々貼り付けるのに"jp.progression.casts"系を使用してみます。
まずは"AboutScene"。前回で作成した適当なMovieClip"div_scene1"とJPG画像をcast系に変更。bmは以前は"name"を指定していたものを"id"に変更。(一応nameもありますが、getInstanceByIdを検証するためidにしておく)

で、とりあえずコンパイルしてみると"AboutScene"を表示させるタイミングでエラーが発生。

TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。

さてこれは何が原因かいな?ということで、考えると"as CastMovieClip"はちと強引だったかしら?ということで、ライブラリの"div_scene1"のリンケージ設定で、基本クラスを"jp.progression.casts.CastMovieClip"に設定。 これでOK。

さて続いて"AboutScene"で生成されて、"ContactScene"で削除される画像のオブジェクトの処理をするために"ContactScene"の中を設定。"_onInit"の中で

としてコンパイル。 "AboutScne"を表示後、"ContactScene"を表示すると、きちんとbm(id=face)が削除される。 ここまではOK。

ただし、その後他のシーンに遷移してまた"ContactScene"に戻ったり、いきなり"ContactScene"に入ったり、用はCastBitmapオブジェクトが存在しない状態だとエラーが出る。

ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。

"if (bm)"では駄目っぽい。
ちと

で何が戻ってきているのか?みてみると

[CastBitmap id="face" name="instance26" group="null"]

な感じ。addChildされているかどうか?は戻り値には関係ないっぽい。 ちなみに"getChildByName"だとremoveChildしたObjectは"null"で戻ってくる。 なので、addChildされているか否かを判定する必要がある・・。 さて・・・。ちょっとひとまずここで休憩。

read more"progression検証 #4 シーンに色々貼り付けてみる(jp.progression.casts)" »

[ Progression3 ]

ヨロヨロ進行中。
さて、シーンの中に普通にMovieClipやら、イメージやらを貼り付けてみる。
SceneObjectは[SceneObject Inheritance →EventIntegrator Inheritance →flash.events.EventDispatcher]という継承なので、DisplayObjectでは無い。ここは一応注意。じゃあDisplayObjectは具体的にシーンごとに分離されているのか?と言われると多分違う。恐らくドキュメントルートにSceneに関係なく配置されているのだと思うが、Sceneをまたいで存在するDisplayObjectにどーアクセスするのか?はまだ分からない。

少し話しがそれたので、元に戻す。
ガイドに書いてあるaddCommandの形でとりあえずMovieClipとBitmapDataを貼り付けてみる。
ライブラリでMovieClipを"div_scene1"、JPG画像を"bm_face"でクラス定義。
Sceneのコンストラクタで

こんな形で生成。 んでもって"_onInit"で
こんな感じでキャスト登録。 同様に"_onGoto"できちんと"RemoveChild"。
で、OK。 本当は用意されているjp.progression.casts Package - Progression 3.0 - API Referenceこの辺のキャスト系を使わないと、あまりAddCommandの中に入れている意味は無いのだと思うけど、まず整理の為に標準のやり方でやってみる。

次にaddCommandの中で定義しないで、直接貼ってみる。

read more"progression検証 #3 シーンに色々貼り付けてみる(標準)" »

[ Progression3 ]

続き、ちと横道にそれて子供のシーン、孫のシーンを作ってみる。
Index.asの_onInitの中で定義された"contact"シーンの子供、孫を作ってみる。

こんな感じ。 まぁなんて簡単。ステキング。

ただ開発の際に子供コンテンツが外部SWFだとして、それが複数の子供を持つ場合等、制作過程で子供コンテンツで動作確認を取りながら開発とか作業分担は難しいのかなぁ?
いや、そもそもSceneに対して外部コンテンツを定義できるのか?が良く分かってないのだけど・・・。(Sceneの中で外部SWFを読み込む感じかしら?) 例えばその場合その外部SWFの中で再びprogressionを定義して階層化したりしたらどうなるのだろうか?(Staticでは無いので一応可能?)
なんか知りたいことが山のように出てきて中々進めない・・。

まぁ一つ一つ検証してみよう。

[ Progression3 ]

Ver.2で途中まで手を付けたままで、なかなか先に進めずにいたprogression。
改めてVer.3で最初からやり直してみる。
同じタイミングでtrick7さんもスタートしている。trick7.com blog: やっと Progression3 をさわりはじめたメモ 多分こちらの方がヨタヨタ展開の予感。

まずprogression.jp | ドキュメント | クラス制作ガイドで一通り実装。色々基本的な項目がパッケージ化されていて便利。元のAS3を忘れそうで恐ろしいw

この時点での感想・疑問点としては

  1. シーンが遷移中にボタンが自動的にKILLされている。これは便利な面もあれば不便な面もある。任意で解除できるのかは追って調べる。(ただ解除したらコマンド系非同期処理になにか破綻が出てくるかもしれない)
  2. flashVarsにJSONを良く使用するのでindex.htmlにJSONを組み込みたいのだけど、テンプレートをどう修正すれば良いのか良く分からない(SWCの中?)。これも追って調べる。
  3. データ構造がまだきちんと分かっていない。Indexの中のnew Progressionの第3引数でrootClass(ガイドではindexScene)を定義しているが、ここをnullにした場合どういう状態になるのか?(暗黙的にindex?)
  4. IndexSceneの中で他のシーン(About,Contact)を生成している理由は?情報構造的にindexSceneの子供という考え方?
  5. Sceneに複数のcastを割り振りできなくなった?(多分できるけど)

勉強会に行きたいのだけど、いつも都合が合わず欠席している。
次回こそなんとしても行きたい。

read more"progression検証 #1" »

"Progression3" ENTRIES