子swf のparentプロパティについて
Flasherにとってかなり初歩的な内容だと思うけど、1時間半ほどはまったのでメモ。
各コンテンツ毎にswfを分割ようとして、してハマりました。
ユーザビリティ、ワークフローを考慮して、1つのFlashサイトを制作する際に
swfファイルを分割することがあるけど、AS3で僕は、ほとんどやったことがありませんでした。(AS2の制作自体ほとんどないけど)
短納期で中規模なサイトを制作することになったので、
swfを分けて作業分担しようとした矢先のハマり。
1.子swfのparentプロパティは、親swfではない
結果から言うと、
子swfのparentプロパティ = 子swf をロードしているLoaderインスタンス
親swf = Loaderインスタンスのparentプロパティで参照
※親swf のルートに 子swf をロードしている場合
子swf から親swf にアクセスする際は、以下のコードになります。
1 | parent.parent |
2.「loader.content」はキャストする
これも当たり前のことですが、loader.contentは、DisplayObjectなのでそのままでは、子swf に設定されてある、親から呼んで欲しいメソッドをコールできません。
(なぜなら、DisplayObjectのメソッドではないから、そんなメソッドはDisplayObjectにはないよって怒られます。)
以下ソースです。
親swf : Parent.as
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package{ import flash.display.*; import flash.events.Event; import flash.net.URLRequest; public class Parent extends Sprite { public function Parent() { init(); } private function init():void { var loader:Loader = new Loader; addChild(loader); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete); loader.load(new URLRequest("child.swf")); } private function _onComplete(e:Event):void { var loaderInfo:LoaderInfo = e.target as LoaderInfo; loaderInfo.removeEventListener(Event.COMPLETE, _onComplete); MovieClip(loaderInfo.loader.content).init(); } } } |
子swf : Child.as
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package { import flash.display.*; public class Child extends MovieClip { private static var _isRoot:Boolean; public function Child() { } public function init():void { _isRoot = parent is Stage?true:false; if (!_isRoot) { trace("parent call"); trace( "parent : " + parent ); trace( "parent.parent : " + parent.parent ); trace( "parent.parent.parent : " + parent.parent.parent ); }else { trace("スタンドアロンで実行"); } } static public function get isRoot():Boolean { return _isRoot; } } } |
[出力結果]
1 2 3 4 | parent call parent : [object Loader] parent.parent : [object Parent] parent.parent.parent : [object Stage] |
やばく忙しかったけど、最近ちょっと落ち着いたので、ハマってきたネタを小出しにしていきます。




















