Reinit_creative log Reinit_creative log rss

Reinit_creative log

about ActionScript3 and Design memo.

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

2010.02.28

Flasherにとってかなり初歩的な内容だと思うけど、1時間半ほどはまったのでメモ。
各コンテンツ毎にswfを分割ようとして、してハマりました。

ユーザビリティ、ワークフローを考慮して、1つのFlashサイトを制作する際に
swfファイルを分割することがあるけど、AS3で僕は、ほとんどやったことがありませんでした。(AS2の制作自体ほとんどないけど)

短納期で中規模なサイトを制作することになったので、
swfを分けて作業分担しようとした矢先のハマり。

1.子swfのparentプロパティは、親swfではない

結果から言うと、

子swfのparentプロパティ = 子swf をロードしているLoaderインスタンス

親swf = Loaderインスタンスのparentプロパティで参照
※親swf のルートに 子swf をロードしている場合

子swf から親swf にアクセスする際は、以下のコードになります。

parent.parent

2.「loader.content」はキャストする

これも当たり前のことですが、loader.contentは、DisplayObjectなのでそのままでは、子swf に設定されてある、親から呼んで欲しいメソッドをコールできません。
(なぜなら、DisplayObjectのメソッドではないから、そんなメソッドはDisplayObjectにはないよって怒られます。)

以下ソースです。
親swf : Parent.as

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

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; }
}
}

[出力結果]
parent call
parent : [object Loader]
parent.parent : [object Parent]
parent.parent.parent : [object Stage]

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

parent call
parent : [object Loader]
parent.parent : [object Parent]
parent.parent.parent : [object Stage]

update 2010.03.04...

[関連記事]

My Icon

Flash+デザインを仕事としています。
info[at]reinit.info
>>detail

レコメンド

ActionScript3アニメーション

ActionScriptアニメーション

アニメーションに関する基礎が得られる本。
コレを読んで、ASが楽しくなった。