イナヅマTVログ

dispatchEventでEvent.targetがかわるよ、どうしようこうしよう

| 0件のコメント

Flashで作ったswfをFlash BuilderでEmbedして使う で使ったクラスを利用しやすいようにチョイ変えようとしたんだけど、dispatchEvent(event)のEventインスタンス引数を関数呼び出しの引数と同じように勘違いしてしまい下記のようなコードにしてしまいダメダメに終わってしまいました。

package
{
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.events.Event;
 
	public class ExampleClass extends MovieClip
	{
		[Embed(source="assets/example.swf", mimeType="application/octet-stream")]
		private var SWFParts:Class;
 
		public function ExampleClass()
		{
			init();;
		}
		private function init ():void
		{
			var lc:LoaderContext = new LoaderContext();
			lc.allowCodeImport = true;
 
			var loader:Loader = new Loader();
			loader.loadBytes(new SWFParts(), lc);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(event:Event):void{
				trace(event.target);//[object LoaderInfo]
				dispatchEvent(event);
				}
			);
		}
	}
}

イベントハンドラに届いたEventインスタンスはtargetが変わります。
当たり前ですよね、targetは発生元になるから…

var example:ExampleClass = new ExampleClass();
example.addEventListener(Event.COMPLETE, onEmbedComplete);
 
function onEmbedComplete (event:Event):void {
	trace(event.currentTarget);// [object ExampleClass]
}

targetが変わらないようにするためには関数を呼び出してもらう方法があります。

package
{
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.events.Event;
 
	public class ExampleClass
	{
		[Embed(source="assets/example.swf", mimeType="application/octet-stream")]
		private var SWFParts:Class;
 
		private var _closure:Function;
 
		public function ExampleClass(closure:Function)
		{
			_closure = closure;
			init();;
		}
		private function init ():void
		{
			var lc:LoaderContext = new LoaderContext();
			lc.allowCodeImport = true;
 
			var loader:Loader = new Loader();
			loader.loadBytes(new SWFParts(), lc);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(event:Event):void{
				trace(event.target);//[object LoaderInfo]
				_closure(event);
				}
			);
		}
	}
}

終了時に呼び出して欲しい関数を先に登録(?)しとくとEventインスタンスの中身は変わらない。

var example:ExampleClass = new ExampleClass(onEmbedComplete);
 
function onEmbedComplete (event:Event):void {
	trace(event.currentTarget);//[object LoaderInfo]
}

setTimeOutなんかで実行して欲しい関数を設定するのに似てるかな。

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください