Adobe Labs – Flash Player 10
akihiro kamijo: Flash Player 10 beta 公開
でた。
3D Effects,Enhanced Drawing API。これで既存の3Dライブラリはより高速化するのかしら?(かなり書き直しになるのかな?)
個人的にはAdvanced Text Layoutでデバイスにアンチエイリアスをかけれる部分がうれしかったりするのだけど、これMACだとどーなるのだろうか??OSでやるのとPlayerでやるのとどっちが優先される?
タグ: flash
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
ちょいとデバッグ用に使用メモリと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を取得することは可能(なはず)。
取り急ぎメモ。
間違っていたらゴメン。