Shut the fuck up and write some code

グダグダ言わずにコードを書きたいブログ

AS3でのカスタムイベントを実装する

GWはAS3書くのが楽しくてずっとやってしまった…。ひっそりとwonderflを始めてみたり。けど単なるサンプル作成メモにしか使ってません。超絶への道は遠い。


AS3は大体イベントドリブンで記述しますが、カスタムイベントが必要になる場合もあるのでそのメモです。


EventDispacherを継承するのが一番手っ取り早いけど、場合によっては他クラスを継承していて、またサブクラスとして継承しなおすケースもあり(別クラスを継承してしまっている場合とか)、継承できないケースもあり。その場合はIEventDispacherをインターフェイスとして実装する方法にて対応する。

下記参考
http://www.scratchbrain.net/ver1/blog/entries/000192.php


ドキュメントクラス Main.as

package {
	
	import flash.display.Sprite;
	import flash.events.Event
	
	public class Main extends Sprite {
		
		public function Main():void {
			
			var test:testEvent = new testEvent()
			
			test.addEventListener("testA", doTestA)
			test.addEventListener("testB", doTestB)
			
			test.doTestA()
			test.doTestB()
			
		}
		
		private function doTestA(evt:Event):void {
			trace("did testA")
		}
		private function doTestB(evt:Event):void {
			trace("did testB")
		}		
	}
	
}


IEventDispacherを実装したクラス testEvent.as

package  {
	
	import flash.events.IEventDispatcher;
	import flash.events.EventDispatcher
	import flash.events.Event
	
	 public class testEvent implements IEventDispatcher {
		
		private var dispatcher:EventDispatcher;
		
		public function testEvent() {
			dispatcher = new EventDispatcher(this);
		}
		
		/*@override*/
		public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
			dispatcher.addEventListener(type, listener, useCapture, priority);
		}
		/*@override*/
		public function dispatchEvent(evt:Event):Boolean{
			return dispatcher.dispatchEvent(evt);
		}
		/*@override*/
		public function hasEventListener(type:String):Boolean{
			return dispatcher.hasEventListener(type);
		}
		/*@override*/
		public function removeEventListener(type:String, listener:Function,useCapture:Boolean = false):void{
			dispatcher.removeEventListener(type, listener, useCapture);
		}
		/*@override*/
		public function willTrigger(type:String):Boolean {
			return dispatcher.willTrigger(type);
		}
		
		public function doTestA():void {
			
			trace("doTestA")
			dispatchEvent(new Event("testA"));
			
		}
		
		public function doTestB():void {
			
			trace("doTestB")
			dispatchEvent(new Event("testB"));
			
		}
		
	}
	
}

EventDispatcherを委譲して使うというのがポイントか。オーバーライドする箇所もあるけど、まんまコピペ対応で。


つか、spriteクラスって既にEventDispacher継承してるのか〜。
http://www.scratchbrain.net/ver1/blog/entries/000189.php

DisplayObjectContainerクラスがEventDispatcherクラスを継承しているので、CustomDispatcherクラスはSpriteクラスを継承しても作成可能です。

http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/display/Sprite.html


AS3はAS2に比べるとだいぶ楽そうだな・・・AS2でカスタムイベントを実装する気が湧かない。