本当のFlash [ Flash ]
Catherine Zeta Jones Flashed! : Wacky Archives
これが正しいFlash。
Catherine Zeta Jones Flashed! : Wacky Archives
これが正しいFlash。
FLASH OOP for ActionScript 3.0
7月頭に発売開始だそうです。
ちなみに前の奴買っていますが、ザラザラって読んで終了してしまった・・・。
今回購入したら完読したいと思います。
今回の帯は誰のコメントがつくのだろうか?

最近controllerのasoがクリアされない。「制御/ASOファイルを削除」しても駄目。Flashを再起動しないと更新されない。
実際更新されているかどうか?はcontrollerのtraceとかを書き換えて出力をチェックしないと良く分からない。これやらないと全然違うバグだと勘違いして延々無意味な修正作業の無限ループに入ってしまう。
なんだろなー、クラス名がどっかで重複しているのだろうか?
良く分からないが、気持ち悪い。
Classを割り当てたMovieClipをルートタイムランの1フレーム目に置くと、そのコンストラクタ内で別のデータ系クラスの初期化が可能なのに、2フレーム目に置くと初期化が出来なくなる。
なにこれ?こんなの初めて。
いわゆる初めてのひと夏の体験みたいな・・・そんな甘酸っぱいメモリーリーク。
いや、別にメモリーリークではない。
FMS 2の話ですが、毎度毎度忘れてしまうんでメモ。
特定のクライアントのメソッドを実行する場合
newClient.call("clientMethod",getterObject,[param1,pram2,...]);clientMethod : 呼び出すclient先のメソッド名(string)
getterObject : 戻り値を受け取るObject(onResult:成功した場合 / onStatus:失敗の場合)
pram1.. : clientMethodに引き渡す引数
SharedObjectの時にはsendなので混同しないように!
バージョンアップしたら設定が全部吹っ飛んだ・・・汗
ちなみにフォントの設定が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でやるのとどっちが優先される?
Adobe - Director 11: 機能
もうこのまま消えていくのか?と勝手に思っておりました。スイマセン。
XBOXとかで使用されている物理エンジン、AGEIA PhysX(NVIDIA PhysX)を採用とのことで、かなり高速になりそう。(ボード積んでいない場合はDirectXなの?)WEB上でのゲームとかがすごいことになるのかな??
良く分からないのだけど、FlashはDirectXを使ったりとかできるの?
Adobe - Open Screen Project
やっと来た。
MSでもAPPLEでもなく、Adobeというのがリアルに感じるな。
日本企業の協賛が少ないのが非常に気になる。
こういうXMLデータのプリセットっつー概念は今までやってなかったな・・・。
どすればきれいにまとまるのか良く分からなくなってきた。
preset
property
model
この3つをどう連携させるか?ってことなんだけど、どーもpropertyとpresetが混合してしまう。
気持ち悪い。
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は反映されないということなのだろうか?
うーん・・・。
なんか微妙な気がする。
navigateToURLでmethod = URLRequestMethod.POSTにしても何故かGET形式でサーバに送信されるのは何故か?URLLoaderではきちんとPOSTされるのに・・。
swfObjectをいつも使っているので、あまり気にしてなかったのですが、AS3内で使用するExpress Installって存在しているんでしたっけ??
Adobe - デベロッパーセンター : Express Install 適用ガイド
Adobe - デベロッパーセンター : SWFObjectを使用したJavaScript Flash Playerの検出と埋め込み
どーもオデの頭ではイマイチ利便性が理解できない。
まぁすんげー長いクラスとかで用途によってメソッドを分類したりしたいときには便利そうだけど。(クラスというよりも巨大なパッケージライブラリか?)
Namespaces -- Flash CS3
BeInteractive! [Namespace]
ここに書いてある「動作の切り替え」ってのはなんか使えそうな気もするけど、オデの仕事の進め方だとここまできっちりやろうとおもったらinterfaceやらもう完全に出来上がっていて、検証とか終わっているかも知れない・・・汗
なんかクラスを縦断してnamespaceで制御できたりするのかしら?とか思ったけど、importも普通にしないといけないし、ただ記述することが増えたという印象しか今のところ無い。
うーむ勉強しなくては。
と思うのはオデだけですか?
なんか方法あるのかしら??
たとえばボタンが2つあってhandlerを同じmethodに引き渡すとして
bt.addEventListener(flash.events.MouseEvent.CLICK,onClick);
bt.skill="aho";
bt2.addEventListener(flash.events.MouseEvent.CLICK,onClick);
bt2.skill="baka";
function onClick(e) {
trace(e.target.skill);
trace(e.currentTarget.skill);
}みたいに書いたりするんだけど、これ
bt2.addEventListener(flash.events.MouseEvent.CLICK,onClick,"aho");いや一応
bt2.addEventListener(flash.events.MouseEvent.CLICK,function(){onClick2("baka")});
function onClick2(skill) {
trace("onClick2",skill);
}とかすればできるけど、これはまたこれで冗長でなんか汚い。
直感的っぽいのは"flash.events.MouseEvent.CLICK"で生成されるEventに何かしら動的に変数を埋め込むーみたいな感じだけど、この辺やろうと思ったらdispatchのタイミングになるから、EventDispatcherから手を入れないといけないのでヤダ。
いやなんか普通に出来そうな気もするのだけど、こういうことってプログラムの世界ではどういう呼称なのかさっぱり分からないから検索出来なかった。
なんかふつーにできることだったらめっさ恥ずかしいんだけど・・・。
ちとplayer9になってルールが変わったのでその辺少し整理しておく。
これはまだAS2の話なのであしからず。
Player9からはこれまでの禁則が緩和され簡単になっている。
やり方は以下のとおり
txf = new TextFormat();
txf.font = "ヒラギノ角ゴ Pro W6";
txf.size = "20";
tx1 = this.createTextField("tx1", 1, 0, 0, 0, 0);
tx1.embedFonts = true;
tx1.setNewTextFormat(txf);
tx1.text = "あほちゃいまんねんばかでんねん";
tx1.autoSize = "left";
これまでは同じswf内に同名フォントで設定されたtextFieldが存在していたりするとconflictしてどちらかが表示されないという問題があったが、Player9で書き出しを行えばその辺クリアになっている感じ。
まだplayer ver8で作らないといけない場合は、また話が少しややこしくなる。
fontのconflictが発生するために同じfont nameのtextFieldが使用できなくなる。
conflictの簡単な特徴としては以下のような感じ。
といったところ。なのでこの条件が無ければver9と同じ設定で実装は可能。(なはず)
font setとして外部linkageする場合にはlinkage font nameを本来のfont nameと異なる名前にして設定することでこの問題を回避できたのだけど、TextFieldへの特定文字の埋め込みの場合font nameの設定を行う術が無い。
簡単に対応しようと思えば、同じfont nameのものを配置しない。ということになる。 つまり静的TextFieldの文字などをアウトラインにしてしまえばよい。ただ後々修正が入る可能性などを考えるとアウトライン化は避けたいところ。
ではどーするか?
まぁ今更使うこともないだろうけど、一応自分のためにもメモしておく。
式を作るのに四苦八苦・・・汗
歳だなあ・・・・
つーか入れ子過ぎる。
ちょっと整理しよーっと。
URLVariablesのdecodeの際に発生するエラー。
2101 The String passed to URLVariables.decode() must be a URL-encoded query string containing name/value pairs.
これを一体どこで拾えばよいのか?分からなくてしばらくはまってしまった。
URLLoader - ActionScript 3.0 Language and Components Referenceを見ていると、明確に取得する方法はなさそうな感じ。サーバとのやり取りの型には問題は存在しないという前提条件で、あとは"HTTPStatusEvent"でサーバエラーかそうじゃないか?を判断すると・・・いうことなのか・・。
(でもHTTPStatusEventでエラーがおこったからと言ってEVENT.COMPLETEをスキップするわけでもなさそう)
これはどうかなー。微妙だ。
URLLoader.dataFormatの設定は逆にリスキーじゃねえ??
これだとURLLoader.dataFormatは指定しないでEvent.COMPLETEハンドラーの中で
new URLVariables
してtry,catchしたほうが確実ってか?
おかしーだろ、じゃdataFormatなんてイラネーじゃねえか。
tryありすぎ・・・多段になっちゃうヨ(書き方がまずいのか?)
っつーかHTTPStatusEventのプロパティがIOErrorEventとかと違うから、一括して単純にエラー処理にまわせない。statusとtextを分岐処理すれば良いだけだけど、面倒なんだけど。せめてstatusとtextを両方に用意しておいてもらいたいと思うのはオデだけですか?
え?event丸ごと投げろって?
まぁそれでもええけど。
apeirophobia: mx.utils.Base64Encoderでバタバタやっていましたが、nutsuさんのお力添えもあり、無事実装できましたので一応ご報告。
TASK
URLVariablesの中に普通のString等と一緒にByteArrayで構造化した情報を突っ込んで送ることができるか?またそれをサーバから再度読み込んで復元できるか?
PROCESS
1)Base64エンコーダを探すの巻
ByteArrayの送信の際にBase64でエンコードする必要があるので、その辺のクラスを探してみる。corelibのSHA256クラスの中とかにmx.utils.Base64Encoderというクラスの存在が確認できるのだが、そんなものはどこにも無い。ということで最初はhttp://crypto.hurlant.com/のcom.hurlant.util.Base64クラスを使って実装。一応これでも動く。
ただし開発が去年で停止しているのとcorelibの中にもcryptoパッケージが移植されているので、できればmx.utils.Base64Encoderで実装してみたいということでモソモソしてみる。
2)Base64Decoderでエラーが出るの巻
nutsuさんからFlex3 SDKの中に入っているという情報を頂き、喜び勇んでゲット。しかしvar bde:Base64Decoder = new Base64Decoder();を行うと
Error: No class registered for interface 'mx.resources::IResourceManager'.
at mx.core::Singleton$/getInstance()
at mx.resources::ResourceManager$/getInstance()
at mx.utils::Base64Decoder()
at test_PostPlay_fla::MainTimeline/frame1()が表示され動作しない。
3)Base64Decoderのエラーを回避するの巻
nutsuさんの環境では動作するということでしばらくググッてhttp://bugs.adobe.com/jira/browse/SDK-12205#action_178148に到達。
ということで以下のスクリプトを追記。
import mx.core.Singleton;
var resourceManagerImpl:Object =
flash.system.ApplicationDomain.currentDomain.getDefinition("mx.resources::ResourceManagerImpl");
Singleton.registerClass("mx.resources::IResourceManager", Class(resourceManagerImpl));4)完成の巻
ということで完成したObjectをbyteArrayしてURLVariablesに突っ込んで送信するスクリプトは以下のような感じ。
おう、これはどこにあるんだよ?!
ねえじゃねえかよ!!
Flex3買わねえといけねえのかよ?!
なんか方法ありそうな気がするのだけど、うまくいかないので書いてみる。
以下のようにbinaryでLoadするとして,
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, _onLoaded);
loader.load( new URLRequest( "dummy.swf" ) );これをMovieClipとして利用するのにはEvent.COMPLETEでバイナリを格納。(実際使っているときはバイナリ管理のクラスをつかってますが)_bytes = URLLoader( e.target ).data;
_bytes.objectEncoding = ObjectEncoding.AMF3;//これは別にいらんけどで、実際addChildする際にはvar loader1:Loader = new Loader();
loader1.loadBytes( _bytes );
addChild( loader1 );っつー感じなのですが、これをたとえば"ahoaho"クラスとかに割り振ってnew ahoaho();とかでインスタンス化できるようにできんのか?っつーこと。
いや別にloader使ってaddChildでもいいのだけどさー。
なんか出来そうな気がするのだけど、うまく割り当てが出来ない。
なんだか変なトラブルばかり起きている今日この頃です。
今作っているものが親swfから外部の子swfを読み込むものなのですが、
なんかしらんけど、Firefoxで子供のswfが表示されないというトラブル。
IEは問題なく表示されサクサクと動いております。
Firefoxでは一応読み込みは出来ているようなのだけど、表示されない。
他のダミーファイルを読み込むと表示される。
なーんでだ?!
処理速度の問題でつか??
うーん、どうやって問題を切り分けていくか非常に悩ましいな・・・。
しかしこれの解決にまた朝までかかるのか・・・?
やだなあ・・・。
オデのためのオデによるブログ "apeirophobia"です。
さて
TweenerでaddCallerを途中で解除したいぜ!というときにどすればええのん?
という質問をされたので書いておきます。
addCallerの場合はproperyが設定されていないのでオデはざっくりと
Tweener.removeTweens(this);で対応しています。
ただこれだとその要素に対して設定されているすべてのTweenが削除されてしまいますが・・。
オデは基本的にaddCallerを停止させるときはremoveのタイミングで、他のモーションも一括で削除することが多いからそんなに不便さは感じていませんけど、まぁ個別に細かく制御したい場合はaddCallerを割り当てるためのSprite(Shapeでもいいのかしら?)を作ってそこで管理するって感じですかね?
そうする場合の注意点なのですが、
ここ数日色々やってきましたが、
apeirophobia: Loader.removeChild、apeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件
Loader.unloadの処理にミスがありました・・・。(恥ずかしい・・・)
apeirophobia: Loader.removeChildの方でテストしていたスクリプトで
_loader.unload();
_loader= null;となっている部分。これunloadでlodar.contentsが非表示になるのでうっかりしていたのですが、loader自体がremoveChildされていませんでした・・・orz。 _world.unload();
removeChild(_world);
_world = null;としてもう一度検証してみました。read more"外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件" »
延々と検証をしてきましたが、なんかLoader.unloadは使わない方が良いのではないか?という結論に至りました。既出だったらスンマセヌ。
やり方としてはunloadを使う代わりに、removeChildを用いる。
で、子供の方でEvent.REMOVED_FROM_STAGEをlisten。
これをキーにしておけばネストしている子供に対しても一気にremove処理が適応できる。
で、それぞれの子供の中でTwennerやらEventListenerを掃除するprivateメソッド組んでおく。
(当然removeのメソッドの中ではEvent.REMOVED_FROM_STAGEもremoveする)
これで前にやったapeirophobia: Loader.removeChildと同じ検証をしてみた。
結果は以下のとおり。
何故エラーになるか?
Error: Error #2069: Loader クラスは、このメソッドを実装しません。
at Error$/throwError()
at flash.display::Loader/removeChild()
DisplayObjectContainerを継承してるんじゃないのか??
ちゃうのか?
俺がまちがっとんのか?
あーあーあー。
あほう。
先日エントリーした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しなければ使用メモリは増加しない。(つまりメモリーチェックの方の関数系では特にメモリーは増加していないということになるかと・・。)
これはクリアできないものなのでしょうか??
以下ソース。
昨日から諸々うにゃうにゃやっていたものを晒してみます。
突っ込みどころ満載だと思いますが・・・汗
目的は
・stand aloneモードなのかcomplex mode?なのかで動作を切り分けたい(開発過程において)
・as2で言うところの_rootを取得したい。
・実行環境がサーバ(http or https)かローカルなのかを取得したい。
・DisplayObject以外でもstageを参照したい。
と言うところ。
使い方はDisplayObjectで、
import img8.Document;
Document.isRoot(this);
ただし一番親の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などが取得できるのが理想なんですが、うまくいかない・・・。出来そうな気だけしているのですが、実力が追いついていません・・。
勘違いなのかよくわからないのだけど、
mother.swf
child.swf
という二つのSWFがあって、mother.swfがchild.swfをloadするとします。で、このときにchild.swfの方で
たとえばmother.swfに
trace(this.loaderInfo.url);
trace(this.stage.loaderInfo.url);続けてmother.swfからchild.swfを読み込みルートタイムラインにaddChild。
で、child.swfの中で
trace(this.loaderInfo.url);
trace(this.stage.loaderInfo.url);
ただし、読み込む前になんかしらスクリプトを実行したりすると(明確にそれが何か不明だけど、今作っているカスタムクラスを定義すると)きちんと(L1="child.swf",L2="mother.swf")の値がでる。
なんか根本的に理解が間違っているのか?
お前はルー大柴かっ!!
とAS3に対して毒づいてみる。
ちとプレビュー前でばたばたしているので走り書きだけど、たとえばプリロードみたいなやり方で、メインコンテンツを先に展開しつつ、後追いで優先度の低い埋め込みリンケージサウンドなんかを実体化させる場合、スクリプト内で"getDefinitionByName"を使って定義しちゃうと、実体化の前に定義できてしまう。(try,catchでも一応定義はされているということでスルーされてしまうっぽい、そもそも定義自体がされていない場合はReferenceErrorをcatchできます。)
生成されたサウンドクラスは値はnullにもならず、よく分からない空の状態で定義されてしまって、soundChannelとかsoundEventでエラーが連発して悲惨な状況になる。
なので実体化されているかどうか?の確認は
みたいな感じになるかと・・。try{
var className:Class = getDefinitionByName(sndID) as Class;
var snd:Sound = new className() as Sound;
if (snd.length > 0) return snd;
}catch (e:ReferenceError) {
return null;
}
非常に厳密にエラー定義がされている割には、この手の抜けっぷりが非常にうっとおしいですな。実体化されているかどうか?もcatch出来るようにしてくれれば良いのに・・・。
もちっとローディングの分散の手法はAS3で的確な方法があるのかもしれないが、まだAS2との折衷みたいな段階で煮詰め切れていない。
今一つ使っている手法としては、でかいサウンド系は外部SWFファイル埋め込んでおいて、
var context:LoaderContext = new LoaderContext();
の定義をしておいて、Event.COMPLETEの発動=実体化として認識してしまう形にすれば、getDefinitionByNameでReferenceErrorを取得することは可能(なはず)。
context.applicationDomain = ApplicationDomain.currentDomain;
取り急ぎメモ。
間違っていたらゴメン。
サウンド消失系の処理で、フェードアウトとかかけるとかなーりいやな感じのエラーがでる。
かといっていきなりstopをかけると「プチ」って小さい音が聞こえるんだよなあ・・・。
いやだなあ・・
まだ検証中なのだけど、ShadedMaterialをMaterialsListで個別の面に割り当てるとエラーになる。
"all"の場合は問題ない。なんだ?(ちなみに元マテリアルはMovieAssetMaterial)
>とりあえず他のshaderをはずして、他のマテリアルで検証。
簡単なところでBitmapFileMaterialあたりから。
これもしかしたら簡単にできるのかわからないけれど、質問。
"hogehoge.fla"というFLAファイルにはデフォルトで"hogehoge.swf"という名前が付くんですが、ここに自動的に"swf/"ってフォルダを定義することはできないんですかね?
この辺の設定ファイルは
C:\Documents and Settings\User\Local Settings\Application Data\Adobe\Flash CS3\ja\Configuration\Publish Profiles\default.xml
にあって、この中の
<flashFileName>名称未設定 - 1.swf</flashFileName>
になるのだけど、ここに"swf/"を入れても適応されないですね。
ディレクトリ設定をプロファイルには定義できないもんなんですかね?
そもそも公開用SWFを"/swf"に、検証用SWFを"/dev"に切り分けたいとか、プロファイル切り替えだけで対応できないか?っつーところの話なんですが・・・。
やっとこGridクラスの改変が終わった。
なんつーかRectangleクラスは使いやすいのか使いにくいのか微妙だ。
正直なところ欲しいのは基準点を保持しているグリッド情報なのだが、その辺をRectangleだけで済まそうとして今矛盾を抱えた状態になっている。これはなんかなんとかしたいなあ・・。・
あとはDisplayObjectじゃなくっても構造配列の重複チェックは、フラグチェックより、フラグの状態をRectangleとかBitmapでグラフィックにしてintersectionとかで判定したほうが早そうな気がした。
いや厳密に検証しているわけじゃないからアレだけど。
たとえば母体を毎回全走査するよりも、ビットマップのピクセルを加算して塗りつぶして、それと比較みたいなほうが効率よさそう(いや内部では同じかもしれんけど)、しかもチャンネル使えば1px*1pxの中に色々な情報を色を用いて埋め込める。(でそれの乗算とか制御した結果もきちんと意味がもてれば結構最強)
ただこっちの方法だとビットマップのサイズ上限(2800px)がグリッドの上限になる。つまり8294400グリッドが最大グリッド範囲になる。まぁ実際ここまで大きな状態のグリッドを取り扱うか?と言われると無いような気もするが、なんかそんな忘れるかもしれない制限条件とか抱えたものを作るのもどうかしら?みたいな。
いやもう頭全然回ってない。
多分後日自分でみても理解できない気がする。
今日は昼から打ち合わせだ。
少しは眠りたい。
もともとBGMで使用するサウンドファイルがでかいので、共有ライブラリにして外部に持たせておこうと思ったのが始まり。で、AS2はもうパッケージにしていたのだけど、AS3でどーやって実装しようかと色々試しているうちに、別に共有書き出しとかしなくっても普通に共有できた。(昔からだっけ?忘れた)
昔は一度タイムライン上に出現(これはMovieClipを作って1フレ目でstop&visible=falseにして、それ以降のタイムラインにサウンドを割り当てて、とかやるアタッチ系プリローダーの手法ね)させないとattachも出来無かったと思うのだけど(違う方法があったらゴメン)、それすらもしなくて良いと言う、超お手軽になっていた。大量の外部ファイルでの連携を必要とするコンテンツには便利だ。
ということでメモ。
肝のクラスは
flash.system.ApplicationDomain;
flash.system.LoaderContext;
の二つ。
たとえば外部SWFに埋め込んだサウンドクラスを引っ張り出したいときは
var shareLoader:Loader = new Loader();
var shareURLreq:URLRequest = new URLRequest(aURL);
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
shareLoader.load(shareURLreq, context);
で、あとはEvent.COMPLETE発動後にそのクラスを引っ張り出してやれば良い。
(音の処理のところは面倒なので書かない。)
これと同じ手法で、イメージ、ムービークリップインスタンス、クラス等も利用可能だと思う。
ただし注意点としては同じクラスが重複しないようにすること。(同じクラスが存在する場合オーバーライドはされないけど、子供のクラスは使えない)
* All code in a SWF file is defined to exist in an application domain. The current domain is where your main application runs. The system domain contains all application domains, including the current domain, which means that it contains all Flash Player classes. * All application domains, except the system domain, have an associated parent domain. The parent domain for your main application's application domain is the system domain. Loaded classes are defined only when their parent doesn't already define them. You cannot override a loaded class definition with a newer definition.
ちなみにこんなことも出来る。
360° Video with Papervision3D
前に書いたような気もするけど、一応メモ。
最近良く思うのだけど、comとかorgとか頭につけてけど、これってそのままドメイン名からいくって方向にならないのかしら?最近その下に複数のリポジトリが出来てて管理しにくい・・・。
特にPaperVison3Dのversion1系とGreatWhite系。
あれ思いっきりクラス名被ってるじゃないですか。
ってみんなそれぞれクラスパスを分けて管理してるのかしら?
いや、ドメイン名にしてもするんだけどさ。
http://code.google.com/p/as3corelib/
とかもう直接汎用クラスライブラリに入れたいじゃないですか・・。
もうそれなら
com.adobe
とかじゃなくて
adobeで良いじゃん。
駄目?
comパッケージって意味なくね?
そんなこたーないですか?
そうですかそうですか・・。
いいよ、自分のクラスは
img8パッケージにするから。
ちょいとメモ。
Loader.content(もしくはLoaderInfo.content)の抽出に悪戦苦闘。
cloneの必要があるのかと思ったがどうもそーでもないっぽい。BitmapDataではなくBitmapらしい。そもそもLoader自体がDisplayObjectのサブクラスだから、そゆことをしてはいけないのかもしれない。
Shape for a "canvas" for drawing content on-screen. In particular, if you want to create an instance for drawing shapes on the screen, and it won't be a container for other display objects, you'll gain significant performance benefits using Shape instead of Sprite or MovieClip.A loaded image will be a Bitmap instance.
A loaded SWF file written in ActionScript 3.0 will be a Sprite or MovieClip instance (or an instance of a subclass of those classes, as specified by the content creator).
Sprite if the object will be created using only ActionScript, or as the base class for a custom display object that will be created and manipulated solely with ActionScript.
If you are creating a class that will be associated with a movie clip symbol in the Flash library, choose one of these DisplayObjectContainer subclasses as your class's base class:
* MovieClip if the associated movie clip symbol has content on more than one frame
* Sprite if the associated movie clip symbol has content only on the first frame
話はずれるが、
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/
と
http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/js/html/wwhelp.htm
って一つにまとまらないのかしら?
タブブラウザだと切り替えがめんどくさい。(ウインドウ一つ追加すればいいだけなんだけど)
AS3にmx.data.binding.ObjectDumperに相当するものはないんかい?
今まで独自で拡張したXMLクラスでXMLの処理をしていたのだけど、まぁ世の中の時流にのってみようと思い、E4X(PDF)に手を出してみた。
で、はまった。
たとえばこんなXMLを読み込んだとしてitemノードのattributes名が不確定の場合、これまではこのノードのattributes(Object)を取得してfor in でぶん回せば属性名と属性値を取得できたのだけど、E4Xで取得したXMLListだとちと違う。<order>
<item id='1' price="100" star="4">
<menuName>burger</menuName></item>
<item id='2' price="200">
<menuName>fries</menuName>
</item>
</order>
たとえば
var _node = myXML.item[0];
var _attr = myXML.item[0].attributes();
for (var i in _attr) {
trace(i,_attr[i]);
}<