子swfから親swfにアクセスでハマる

Flashのステージ(親swf)に外部のswf(子swf)をロードして、子swfから親swfの関数にアクセスしようとしてハマりました。

以下、うまく動作したソースです。
親のタイムライン上のbtn_1を押したとき、親のタイムライン上にLoaderを直接置いて、そこに子を呼び出して、子の中のボタンが押されたときに親のタイムラインの関数invisibleを呼んでいます。

親swfのメインタイムライン

子swfの中のムービークリップのボタンのタイムライン

まず、子swfにMovieClip(root)と書いても親を指しません。子単体で動かしたときと同じで、子のメインタイムラインを指します(正確にはちょっと違いますがイメージとして)。

そして、Loaderは呼び出しの際には箱を生成してそこにswfを展開するので、Loader自体を子から指すにはroot.parentとする必要があります。

また、親からすれば子はLoaderの中のものなのでMovieClipではなくLoaderにキャストする必要があります。なので、Loader(root.parent)となり、これで親で設置したLoaderのところまできました。

そのLoaderのrootがメインタイムラインとなるので、MovieClip(Loader(root.parent).root)として、後ろに関数をつければ完成です。

TypeError: Error #1034: 強制型変換に失敗しました。
flash.display::Stage@2c84cb51 を flash.display.MovieClip に変換できません。

え!?

もう一つ、ポイントがあります。
rootのstageは特別なので(確か)、そこに設置したら手が出せなくなります。そしてStageは静的なのでキャストできないんです(多分)。

実は最初、親swfでthisではなく、stageにaddChildしてしまっていたんです(ブログからコピペして)。大ハマリしましたので頭の片隅にでもちょろっと置いておいてください。

  • このエントリーをはてなブックマークに追加

水蕗をフォローする