なんだかまさに付箋状態になりつつある”Progression3″カテゴリ・・・。
ということでもう一つ追加。
外部からイメージを読み込むのに使うクラス”CastImageLoader”。これは”flash.display.Loader”のサブクラスなので”LoadChild(←flash.events.EventDispatcher)”と違ってコマンドで処理待ちしてくれない。
これをコマンドで監視できるようにするのはどーすればよいか?というお話。
“Command”クラスを継承して”CastEvent.CAST_LOAD_COMPLETE”でイベントを排出したり、”executeComplete();”したりすればなんかいけそうな気もするが、ちょっとそれは冗長な気がする。
“Func”クラスを用いて、ごにょごにょしたりしてコマンド監視下に置けないかしら?
“after”メソッドの中でゴニャゴニャしてもいけそうな気もするが、今頭がまわらないので忘れないようにメモ。
タグ: flash
エラー処理などは放り出して、先に進みます。前回のエントリーではIndexSceneで外部XMLを読み込みましたが、最初のLoading時に設定系外部XMLやらを読み込む事例は多いかと思いますので、次はPreloaderで外部ファイルを読み込んで、SceneObject等からそのデータにアクセスするのはどーすればよいのか試してみます。
まず前検証でIndexSceneに設定した外部XMLの読み込みをPreloaderに移植します。
#code-1
こんな感じでOK。
実行すると外部XMLの読み込みが終わってからIndexが展開されます。ステキ。
この問題(apeirophobia: Progressionの中でPV3D)がまだクリアになっていないのだけど、ちょっと先に進みます。今回は外部データの読み込みを試してみます。
一般的に外部データとして想定されるものはxml,json,jpg,swf等があります。as3になってバイナリも読み込めるのですがそれはまた別の話で。
最初に至極まっとうにXMLでやってみます。IndexScene.asの_onLoadの中に組み込んでみます。
#code-1
こんな感じ。
次にcommandを使ってみる。
続いて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されているか否かを判定する必要がある・・。
さて・・・。ちょっとひとまずここで休憩。
ヨロヨロ進行中。
さて、シーンの中に普通に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の中で定義しないで、直接貼ってみる。
progression検証 #1
Ver.2で途中まで手を付けたままで、なかなか先に進めずにいたprogression。
改めてVer.3で最初からやり直してみる。
同じタイミングでtrick7さんもスタートしている。trick7.com blog: やっと Progression3 をさわりはじめたメモ 多分こちらの方がヨタヨタ展開の予感。
まずprogression.jp | ドキュメント | クラス制作ガイドで一通り実装。色々基本的な項目がパッケージ化されていて便利。元のAS3を忘れそうで恐ろしいw
この時点での感想・疑問点としては
- シーンが遷移中にボタンが自動的にKILLされている。これは便利な面もあれば不便な面もある。任意で解除できるのかは追って調べる。(ただ解除したらコマンド系非同期処理になにか破綻が出てくるかもしれない)
- flashVarsにJSONを良く使用するのでindex.htmlにJSONを組み込みたいのだけど、テンプレートをどう修正すれば良いのか良く分からない(SWCの中?)。これも追って調べる。
- データ構造がまだきちんと分かっていない。Indexの中のnew Progressionの第3引数でrootClass(ガイドではindexScene)を定義しているが、ここをnullにした場合どういう状態になるのか?(暗黙的にindex?)
- IndexSceneの中で他のシーン(About,Contact)を生成している理由は?情報構造的にindexSceneの子供という考え方?
- Sceneに複数のcastを割り振りできなくなった?(多分できるけど)
勉強会に行きたいのだけど、いつも都合が合わず欠席している。
次回こそなんとしても行きたい。
久しぶりにFlashを触っていたのですが、クラスファイルを変更したものがパブリッシュの際に反映されず困っていました。FlashDevelopをバージョンアップさせたからかなぁ?とかFlashゾンビ対策|_level0.CUPPYとか色々検証してみたのですが、どれも駄目。
で、結局コントローラーに相当するクラスの名前を”Main”にしていたのを”Ctrl”に変更したらうまく反映されるようになりました。”Main”ってそんなに特殊な言葉だったっけな?
全然AS3とかの話じゃないですが、とりあえずエントリー。
Catherine Zeta Jones Flashed! : Wacky Archives
これが正しいFlash。
FLASH OOP for ActionScript 3.0
7月頭に発売開始だそうです。
ちなみに前の奴買っていますが、ザラザラって読んで終了してしまった・・・。
今回購入したら完読したいと思います。
今回の帯は誰のコメントがつくのだろうか?
バージョンアップしたら設定が全部吹っ飛んだ・・・汗
ちなみにフォントの設定がTools/Program settings/Mainから出来るようになって喜んだのだけど、Console FontとDefault Fontだけということで、なんかエディタ部分のフォントは従来どおり”C:\Documents and Settings\User\Local Settings\Application Data\FlashDevelop\Settings\ScintillaNET.xml”で行うかんじらしい。まぁ良いけど。
何が具体的に変わったのかまだ良く分からないですが、Global Classパスを色々設定している人は先にそこらへんメモしてからバージョンアップしてください。(一応プロジェクトレベルで設定されているクラスパスはそのまま継承されています)
Adobe Labs – Flash Player 10
akihiro kamijo: Flash Player 10 beta 公開
でた。
3D Effects,Enhanced Drawing API。これで既存の3Dライブラリはより高速化するのかしら?(かなり書き直しになるのかな?)
個人的にはAdvanced Text Layoutでデバイスにアンチエイリアスをかけれる部分がうれしかったりするのだけど、これMACだとどーなるのだろうか??OSでやるのとPlayerでやるのとどっちが優先される?
If you modify the accessibility properties for multiple objects, only one call to the Accessibility.updateProperties() method is necessary; multiple calls can result in reduced performance and erroneous screen reader output.
この仕様どうなんだろうか?
つまり時間によって内容が変化していくようなインターフェイスの場合、updateProperties()した後のAccessibilityPropertiesは反映されないということなのだろうか?
うーん・・・。
なんか微妙な気がする。
オデのためのオデによるブログ “apeirophobia”です。
さて
TweenerでaddCallerを途中で解除したいぜ!というときにどすればええのん?
という質問をされたので書いておきます。
addCallerの場合はproperyが設定されていないのでオデはざっくりと
で対応しています。
ただこれだとその要素に対して設定されているすべてのTweenが削除されてしまいますが・・。
オデは基本的にaddCallerを停止させるときはremoveのタイミングで、他のモーションも一括で削除することが多いからそんなに不便さは感じていませんけど、まぁ個別に細かく制御したい場合はaddCallerを割り当てるためのSprite(Shapeでもいいのかしら?)を作ってそこで管理するって感じですかね?
そうする場合の注意点なのですが、
ここ数日色々やってきましたが、
apeirophobia: Loader.removeChild、apeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件
Loader.unloadの処理にミスがありました・・・。(恥ずかしい・・・)
apeirophobia: Loader.removeChildの方でテストしていたスクリプトで
となっている部分。これunloadでlodar.contentsが非表示になるのでうっかりしていたのですが、loader自体がremoveChildされていませんでした・・・orz。
ということで
としてもう一度検証してみました。
以下その結果。
延々と検証をしてきましたが、なんかLoader.unloadは使わない方が良いのではないか?という結論に至りました。既出だったらスンマセヌ。
以下の検証には誤りがありました。
正確な検証結果はapeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件を参照してください。スイマセン。
やり方としてはunloadを使う代わりに、removeChildを用いる。
で、子供の方でEvent.REMOVED_FROM_STAGEをlisten。
これをキーにしておけばネストしている子供に対しても一気にremove処理が適応できる。
で、それぞれの子供の中でTwennerやらEventListenerを掃除するprivateメソッド組んでおく。
(当然removeのメソッドの中ではEvent.REMOVED_FROM_STAGEもremoveする)
これで前にやったapeirophobia: Loader.removeChildと同じ検証をしてみた。
結果は以下のとおり。
Loader.removeChild
何故エラーになるか?
Error: Error #2069: Loader クラスは、このメソッドを実装しません。
at Error$/throwError()
at flash.display::Loader/removeChild()
DisplayObjectContainerを継承してるんじゃないのか??
ちゃうのか?
俺がまちがっとんのか?
あーあーあー。
あほう。
以下の検証には誤りがありました。
正確な検証結果はapeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件を参照してください。スイマセン。
img8.debug.Debugger
先日エントリーしたDebuggerをちょっと変えました。
基本FPS計測はOFF。でFPS表示の前のボタンをクリックして計測開始、再度クリックで計測中断。ただこれによって一度増えたメモリ消費が下がるのか?はまだ完全に検証できていません・・。(もともとがあまりに微小な値なのでかなり長時間回して検証しないと良く分からん)あとはグラフの幅だとか、レコードする個数とかプロパティを設定できるように。(普通はさわらないだろうけど)
ちょいとデバッグ用に使用メモリとFPSを表示する”debugger”クラスなるものを作ってみた。
で、色々試していると、FPSを算出するためにEvent.ENTER_FRAMEをまわしているだけでメモリが4KBぐらいずつ浪費されているっぽい。Event.ENTER_FRAMEのhandlerに渡されるeventをnullにしてみたりしたのだけど変わらない。
メモリ変移を描画するために(ダブルクリックでグラフ表示)時間を取得しているのだけど、それの桁が増えるからその分のメモリが浪費されているのかと思ったのだけど、どーもそうではないらしい。(メモリのチェックはTimerで行っている。)Event.ENTER_FRAMEのhandler内でフレームカウントさせている変数を変化させず、中を空にしていても増加していく。(微々たる量だけど)で、Event.ENTER_FRAMEをaddしなければ使用メモリは増加しない。(つまりメモリーチェックの方の関数系では特にメモリーは増加していないということになるかと・・。)
これはクリアできないものなのでしょうか??
img8.Document
昨日から諸々うにゃうにゃやっていたものを晒してみます。
突っ込みどころ満載だと思いますが・・・汗
目的は
・stand aloneモードなのかcomplex mode?なのかで動作を切り分けたい(開発過程において)
・as2で言うところの_rootを取得したい。
・実行環境がサーバ(http or https)かローカルなのかを取得したい。
・DisplayObject以外でもstageを参照したい。
と言うところ。
使い方はDisplayObjectで、
といった感じで実行すると、そのDisplayObjectの含まれるswfが最上位である場合rootとstageが格納。それ以降読み込まれた外部swfでisRootがcallされてもreject(多分)。
ただし一番親のswfでisRootが実行されていないと、errorをthrowします。
なので、とりあえず一番親になるswfでは実行必須になってしまっています。
(ここを子供からでも解決できるように悪戦苦闘していました)
用意されているmethod,propertyは以下のとおり。
isRoot(displayInstance:DisplayObject):Boolean
displayInstanceがrootに相当するか否か?相当する場合Documentクラス内にrootとstageが定義されます。親であった場合true。
root:DisplayObject [read-only]
最上位のdisplayObjectを戻す。
stage:Stage [read-only]
ステージクラスを戻します。一応これ経由でlistener登録、削除できますので、DisplayObject以外でonResizeを取得することも可能なはず。
url:String [read-only]
最上位のswfのURLを戻します。まぁ特に使うことはないかと。
isLocal:Boolean [read-only]
動作環境がローカルかサーバ上(http or https)で動作しているか?これでローカル開発モード、サーバモードの切り替えなどを行えるかと・・。
っつーようなかんじです。理想は親swfでisRootしないで、子swfから実行してもroot,stage,urlなどが取得できるのが理想なんですが、うまくいかない・・・。出来そうな気だけしているのですが、実力が追いついていません・・。
getDefinitionByNameの罠
ちとプレビュー前でばたばたしているので走り書きだけど、たとえばプリロードみたいなやり方で、メインコンテンツを先に展開しつつ、後追いで優先度の低い埋め込みリンケージサウンドなんかを実体化させる場合、スクリプト内で”getDefinitionByName”を使って定義しちゃうと、実体化の前に定義できてしまう。(try,catchでも一応定義はされているということでスルーされてしまうっぽい、そもそも定義自体がされていない場合はReferenceErrorをcatchできます。)
生成されたサウンドクラスは値はnullにもならず、よく分からない空の状態で定義されてしまって、soundChannelとかsoundEventでエラーが連発して悲惨な状況になる。
なので実体化されているかどうか?の確認は
みたいな感じになるかと・・。
非常に厳密にエラー定義がされている割には、この手の抜けっぷりが非常にうっとおしいですな。実体化されているかどうか?もcatch出来るようにしてくれれば良いのに・・・。
もちっとローディングの分散の手法はAS3で的確な方法があるのかもしれないが、まだAS2との折衷みたいな段階で煮詰め切れていない。
今一つ使っている手法としては、でかいサウンド系は外部SWFファイル埋め込んでおいて、
の定義をしておいて、Event.COMPLETEの発動=実体化として認識してしまう形にすれば、getDefinitionByNameでReferenceErrorを取得することは可能(なはず)。
取り急ぎメモ。
間違っていたらゴメン。