読み込まれた swf からメインタイムラインの関数にアクセスする

| comment (0) | trackback (0)

どのタイムラインからでもメインタイムラインは DisplayObject.root プロパティで参照することができます。 DisplayObject.root プロパティを使うと loader インスタンスによって読み込まれた swf のタイムラインからでもメインタイムラインを参照できます。

読み込まれる側の swf にはボタンとなるオブジェクト(インスタンス名「button」)が配置されています。 タイムラインに次のようなコードを記述します。

button.addEventListener(MouseEvent.CLICK, onClick);

function onClick(event:MouseEvent):void {
	var _loader:Loader = loaderInfo.loader;
	trace(_loader.root);
}

読み込まれる側の swf をファイル名「test.swf」としてパブリッシュしておきます。 では、呼び出し元のムービーに次のコードを記述して「test.swf」を読み込ませてみましょう。

var url:String = "test.swf";
var _loader:Loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onCompleted);
_loader.load(new URLRequest(url));

function onCompleted(event:Event):void {
	event.target.removeEventListener(Event.COMPLETE,onCompleted);
	addChild(event.target.loader);
}

ムービーには「test.swf」が読み込まれます。 「button」インスタンスをクリックすると、[出力パネル]には次のように出力されます。

[object MainTimeline]

一見問題がないように見えますが、呼び出し元のメインタイムラインに定義している関数を、DisplayObject.rootを参照で呼出してみるとエラーが起こります。

呼び出し元のムービーに次のコードを追加しておきます。

function testFunc():void {
	trace(this);
}

では、読み込まれる側の swf からこの testFunc() を呼び出してみましょう。onClick 関数を変更します。

function onClick(event:MouseEvent):void {
	var _loader:Loader = loaderInfo.loader;

	_loader.root.testFunc();
}

[ムービープレビュー]を行うと、次のようなエラーが出力されます。

1061: 未定義である可能性のあるメソッド testFunc を、静的型 flash.display:DisplayObject の参照を使用して呼び出しました。

これは、root が DisplayObject クラスのプロパティのためです。 DisplayObject クラスはユーザーはフレームアクションで自由に変数(プロパティ)や関数(メソッド)を定義することができません。ですので、 DisplayObject クラス定義されていないメソッドを呼び出した段階でエラーになってしまいます。 メインタイムラインは実際にはMovieClipクラスで、そこに追加した関数を呼び出すためには DisplayObject.root プロパティ値の型を、MovieClip型にキャスト(変換)しなければなりません。

※ データ型を明示的に変換することを、「キャスト」と呼びます。

onClick 関数を次のように変更します。

function onClick(event:MouseEvent):void {
	var _loader:Loader = loaderInfo.loader;
	var mainRoot:MovieClip = MovieClip(_loader.root);
	mainRoot.testFunc();
}

これで呼び出し元のメインタイムラインにある testFunc() を呼び出す事ができます。

trackback (0)

trackback URL: http://gelsol.sub.jp/core/mt-tb.cgi/18

Post your comment