子swf のparentプロパティについて

2010.02.28  Category:ActionScript3.0
Clip to Evernote   はてなブックマーク - 子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]

やばく忙しかったけど、最近ちょっと落ち着いたので、ハマってきたネタを小出しにしていきます。

RSS Reader
RSSリーダーへの登録をお願いします。
トップへ戻るボタン

著者

大庭俊介
株式会社サイバーエージェント所属の紙デザイナー上がりのFlashデベロッパー。アメーバピグ内のコンテンツ企画、実装を手掛けています。金沢美術工芸大学出身。
follow twitter

おすすめ

フィジカルコンピューティングを「仕事」にする

初めての共著作。Kinect作品PiggFighterの項目を執筆しています。

基礎からのiOS SDK

iPhone開発ド素人の僕が現在、勉強中の本。結構丁寧に書かれてあって分かりやすい。特にWebブラウザ作成のチュートリアル部分の説明でかなり理解が深まった。

詳説 ActionScript 3.0

半端ないページ数だけど、一度は読んでおいたほうがよいと思う良書。ひと通り読み終える頃には、大抵のことは分かるようになる。