親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と指定しているのと何が違うんだということになるんですが、コンパイラだけの問題なのかな、気が向いたらもうちょい調べてみよう(たぶん、調べない)

トラックバック(0)

このブログ記事に対するトラックバックURL: http://eternitydesign.net/mt/mt-tb.cgi/199

コメントフォーム

AUTHOR

名古屋でひっそりと活動中。
ホームページ制作、Flashコンテンツ制作など制作依頼がありましたらお気軽にご連絡ください。
ご希望の方には制作実績も同時にお伝えいたします。

TAG CLOUD