forked from: forked from: あなたのイベントハンドラを教えて!coppiee流

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

ActionScript3 source code

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

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

        public function FlashTest() {
            // ボタンを作成
            _label = new MyTextField();
            _label.x = 150; _label.y = 280;
            
            // 自分流のイベントハンドラを記述ください
            // coppieee 流をみて
            // ひどいコードを書いてみたくなりました。
            (["A", "B", "C"]).forEach(
				function ($itemName:String, $index:int, ...r):void {
					var btn:MyButton = new MyButton;
					btn.text ='Button ' + $itemName;
					btn.addEventListener("ロール・オーバー", say);
					btn.addEventListener("クリック", say);
					btn.y = 230;
					btn.x = 70 + $index * 120;
					addChild(btn);
					
					function say(what:String):void {
						_label.text = $itemName + "が"+ what + "されました。";
					}
				}
            );
            addChild(_label);
        }
    }
}

const 翻訳:Object = {
	"ロール・オーバー" : "rollOver",
	"クリック" : "click"
};

function bind(f:Function, a:Array, b:int = 0):Function {
	return function (...args):* {
		return f.apply(null, args.slice(0, b).concat(a));
	}
}

function keys(o:Object):Array {
	var _keys:Array = [];
	for (var key:String in o) _keys.push(key);
	
	return _keys;
}

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;
    }
    
	override public function addEventListener(日本語:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
	{
		super.addEventListener(翻訳[日本語] || "unkown type", bind(listener, [日本語]), useCapture, priority, useWeakReference);
	}
    
    /**
    * ボタンの文言を設定します。
    */
    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;
    }
}