name値からイベントハンドラを自動で登録

by mtok forked from あなたのイベントハンドラを教えて! (diff: 100)
あなたのイベントハンドラを教えて!
*
* 複数のイベント&複数のインスタンスに
* イベントハンドラを設定するときに
* みなさんの記述方法の違いを知りたい。
*
* [ルール]
* 画面上に3つのボタンが用意されており、
* クリックとロールオーバーの
* イベントハンドラを記述してください。
♥0 | Line 131 | Modified 2010-06-05 18:37:14 | MIT License
play

ActionScript3 source code

/**
 * Copyright mtok ( http://wonderfl.net/user/mtok )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/vJKJ
 */

// forked from clockmaker's あなたのイベントハンドラを教えて!
/**
* あなたのイベントハンドラを教えて!
*
* 複数のイベント&複数のインスタンスに
* イベントハンドラを設定するときに
* みなさんの記述方法の違いを知りたい。
*
* [ルール]
* 画面上に3つのボタンが用意されており、
* クリックとロールオーバーの
* イベントハンドラを記述してください。
*/
package {
	
	import flash.utils.describeType;
    import flash.display.Sprite;
	import flash.events.Event;
    import flash.events.MouseEvent;
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	
    public class LazyHandler extends Sprite {
		public namespace lazy_mouse = "http://www.matzmtok.com/namespace/lazy_mouse/";
		use namespace  lazy_mouse;
        
		private var _btnA:MyButton;
        private var _btnB:MyButton;
        private var _btnC:MyButton;
        private var _label:MyTextField;

        public function LazyHandler() {
            // ボタンを作成
			_init();
            _build();
            
            // 自分流のイベントハンドラを記述ください            
        }
        //lazy_mouseの名前空間と "インスタンスの名前_イベント文字列"の名前でメソッドを宣言する。
        //
		lazy_mouse function btnA_click(e:MouseEvent):void 
		{
			_label.text = "A がクリックされました"; 
		}
		lazy_mouse function  btnA_rollOver(e:MouseEvent):void 
		{
			_label.text = "A がロールオーバーされました"
		}
		lazy_mouse function btnB_click(e:MouseEvent):void 
		{
			_label.text = "B がクリックされました"; 
		}
		lazy_mouse function  btnB_rollOver(e:MouseEvent):void 
		{
			_label.text = "B がロールオーバーされました"			
		}
		lazy_mouse function btnC_click(e:MouseEvent):void 
		{
			_label.text = "C がクリックされました"; 
		}
		lazy_mouse function  btnC_rollOver(e:MouseEvent):void 
		{
			_label.text = "C がロールオーバーされました"	
		}
		lazy_mouse function btnC_rollOut(e:MouseEvent):void{
			_label.text = "C ロールアウト";
		}
		lazy_mouse function btnC_mouseDown(e:MouseEvent):void{
			_label.text = "C マウスダウン";
		}
		lazy_mouse function btnC_mouseUp(e:MouseEvent):void{
			_label.text = "C マウスアップ";
		}
        /**
        * インターフェースを作る
        */
        private function _build():void {
            _label = new MyTextField();
            _label.x = 150; _label.y = 280;
            addChild(_label);

            _btnA = new MyButton();
            _btnA.text = "Button A"; 
            _btnA.name = "btnA"; 
            _btnA.x = 70; _btnA.y = 230;
            addChild(_btnA);
            
            _btnB = new MyButton();
            _btnB.text = "Button B";
			_btnB.name = "btnB";
            _btnB.x = 190; _btnB.y = 230;
            addChild(_btnB);
   
            _btnC = new MyButton();            
            _btnC.text = "Button C";
			_btnC.name = "btnC";
            _btnC.x = 310; _btnC.y = 230;
            addChild(_btnC);
        }
		public function _init():void
		{
			var container:DisplayObjectContainer = this;
			var events:XMLList = describeType(MouseEvent).constant.@name;
			var handlers:XMLList = describeType(LazyHandler).factory.method.(hasOwnProperty("@uri")).(@uri=="http://www.matzmtok.com/namespace/lazy_mouse/");
			
			addEventListener(Event.ADDED, function(ev:Event):void {
				var d:DisplayObject = ev.target as DisplayObject;
				var m:String;
				if (d && container.contains(d)) {
					if (d != container) {
						for (var i:int = 0; i < events.length(); i++) {
							m = d.name + "_" + MouseEvent[ events[i].toString() ];
							if ( handlers.(@name == m).@name.toString() != "") {
								d.addEventListener( MouseEvent[ events[i] ], container[m] );
							}
						}
					}
				}
			} );
			addEventListener(Event.REMOVED, function(ev:Event):void { 
				var d:DisplayObject = ev.target as DisplayObject;
				var m:String;
				
				if (d && container.contains(d) ) {
					if (d != container) {
						for (var i:int = 0; i < events.length(); i++) {
							m = d.name + "_" + MouseEvent[ events[i].toString() ];
							if ( handlers.(@name == m).@name.toString() != "") {
								d.removeEventListener( MouseEvent[ events[i] ], container[m] );
							}
						}
					}
				}
			} );
		}

    }
}

import flash.display.*
import flash.text.*;

/**
* MyButton クラスはボタン的な挙動をするようにしたSpriteです。
*/
class MyButton extends Sprite {
    private var _text:MyTextField;
    /**
    * 新しい MyButton インスタンスを作成します。
    */
    public function MyButton(){
        graphics.beginFill(0x000000);
        graphics.drawRoundRect(0, 0, 100, 30, 5, 5);
        addChild(_text = new MyTextField);
        buttonMode = true;
    }
    /**
    * ボタンの文言を設定します。
    */
    public function set text(value:String):void {
        _text.text = value;
        _text.x = (100 - _text.textWidth) / 2;
        _text.y = (30 - _text.textHeight) / 2;
    }
}

/**
* MyTextField クラスは適当な初期設定をしただけのテキストフィールドです。
*/
class MyTextField extends TextField {
    /**
    * 新しい MyTextField インスタンスを作成します。
    */
    public function MyTextField() {
        defaultTextFormat = new TextFormat("_sans", 12, 0xFF0000);
        autoSize = "left";
        selectable = false;
        mouseEnabled = false;
    }
}