親SWFと子SWFと同名クラス
問題の発覚から解決まですべてをエントリするので、無駄に長いです。
親SWFから子SWFを読み込むFlash(だから、親子なんだけども)
当然、親と子のSWFを別々に制作するわけですが、
それぞれのSWF自体の動作は確認して完成!と思っていたら
どうも親から読み込んで表示したときの子SWFの動作がおかしい。
原因はライブラリに登録してあるMCのクラス名がかぶっていて、親と子でほぼ同じ動作なんだけど、微妙に違うっていう感じだったので、制作のときは同名のクラスをそれぞれ別のasファイルを参照するようにしていたんですが、親からLoader使って子SWFを読み込んだときだけ親クラスと同じ動作をして困った。
まぁ、こうなるんだろうから、これがFlashの仕様なんだろうけど、これがどういう仕組みなのかさっぱりわからない。
簡単に解決するなら、親か子のどちらかのクラス名を変えてやるだけです。
また、頭のいい人はどちらでも動作するようなコードを書けるんだと思います。
(今回のクラスの場合は、ROLL_OVER時に親SWFのドキュメントクラスにあるfunctionを呼び出していただけなんですが、当然、親と子では親にあるfunctionへのアクセス方法が変わる。なので、なんか頭いいコードで回避できる方法もあるのかもしれないけど、自分にはわからん!)
続きに解決編。
が、
やっぱり気になるのでgoogleでいろいろなキーワードで検索してみるけども、ズバリというのが見つからない中、よく検索に引っかかっていたのが下記のサイト
http://www.at-sonic.com/blog/archives/2008/02/swfswfnew.php
状況的には逆で微妙に違うんだよなぁとぼーっと眺めていたときに、神が降りたのか眠っていた脳が起きたのかわかりませんが、なぜか気になったのが下記のコード
var context:LoaderContext = new LoaderContext(); context.applicationDomain = ApplicationDomain.currentDomain;
ApplicationDomain
どっかで目にしたことがあるようなないような感じ。
早速、購入したばかりのActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応で調べてみると、まさにこいつだった。
本の説明を一部記述してみると、
『Flash Playerは、アプリケーションドメインという概念でクラス定義を管理しています。・・(省略)・・この仕組みは、子SWFを動的なクラスライブラリとして使ったり、複数の子SWFで親SWFファイルのクラスを共有したいときなどに便利です。』
要するに、同名クラスをそれぞれに共存させたいときは、親とは違うアプリケーションドメインを指定してロードすればいい。
コードは下記。
var appDomain = new ApplicationDomain(); var context = new LoaderContext(); context.applicationDomain = appDomain; fileLoader.load(request, context);
相変わらずの超省略コードですが、これで親SWFと子SWFとで、別のアプリケーションドメインになるので、同名クラスが共存できます。
他にも指定方法はありますが、それは、こちらなどより詳しいサイトをご覧ください。
この指定がないときは同じアプリケーションドメインにロードされているってことでいいんだろうか、まぁ、同名クラスが共存してないので、そういうことだと思うんですが、
そうなるとこちらでcurrentDomainと指定しているのと何が違うんだということになるんですが、コンパイラだけの問題なのかな、気が向いたらもうちょい調べてみよう(たぶん、調べない)
