In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Managing dynamically generated buttons by name / 名前によるボタン管理

初投稿です。稚拙かつ汚いコードでごめんなさい。
 このコードでは、ボタンの押し、ロールオーバ、ロールアウト判定
をやっているだけで、別に特別にこれと言った特徴ははありません。
ボタンの押しの判定については、押されたムービークリップの
名前 name プロパティで管理しています。私事で恐縮ですが、
管理しないといけないボタンが多い時、
リスナー追加を増やしたくないときなどに使っている方法です。
ボタン名のフォーマットは次のようにしています
例: ボタンのプリフィックス_ボタンの名前
prefixと名前の間に挟んでいるのは _ (アンダースコア)です。
ボタンのprefixを利用して体系的に設計すると(例えるなら
郵便番号の要領)より楽になります。
mouse over / out は、wonderflではうまく動かすことが
出来ませんでした。
Get Adobe Flash player
by hacker_fjam9dgc 12 Mar 2010
    Embed
/**
 * Copyright hacker_fjam9dgc ( http://wonderfl.net/user/hacker_fjam9dgc )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8wSF
 */

// 初投稿です。稚拙かつ汚いコードでごめんなさい。
// このコードでは、ボタンの押し、ロールオーバ、ロールアウト判定
// をやっているだけで、別に特別にこれと言った特徴ははありません。
// 
// 
// ボタンの押しの判定については、押されたムービークリップの
// 名前 name プロパティで管理しています。私事で恐縮ですが、
// 管理しないといけないボタンが多い時、
// リスナー追加を増やしたくないときなどに使っている方法です。
// 
// ボタン名のフォーマットは次のようにしています
//
// 例: ボタンのプリフィックス_ボタンの名前
// 
// prefixと名前の間に挟んでいるのは _ (アンダースコア)です。
// 
// ボタンのprefixを利用して体系的に設計すると(例えるなら
// 郵便番号の要領)より楽になります。
// 
// mouse over / out は、wonderflではうまく動かすことが
// 出来ませんでした。
package {
	// diaplay系
	import flash.display.Graphics;
	import flash.display.MovieClip;
	import flash.display.Sprite
    import flash.display.Shape;

    // text系
    import flash.text.TextField;
    import flash.text.TextFieldType;
    
    // イベント系
    import flash.events.MouseEvent;

    public class FlashTest extends Sprite {
    		// いつでも気軽に呼び出せるようにあらかじめ宣言しておく
    		private var tf_messageField : TextField;
    		
        public function FlashTest() {
            // メッセージ用
            makeMessageField ();
            
            // ボタン作ります
            // ボタン名、X位置、Y位置、大きさ
            makeAbutton ("button_1", 50 , 50 , 10 , 0xF00FF0);
            makeAbutton ("button_2", 150 , 50 , 10 , 0xF00FF0);
            
            // 後は面倒なのでフォーループで
            var yoko : int = 4 ;
			var tate : int = 5;
			var konoTate  : int ;
			var konoYoko  : int ;
			for ( var i:int=2; i<yoko * tate ;i++) {
				konoTate  = Math.floor ( i / yoko ) ;
				konoYoko  = i - Math.floor ( i / yoko ) * ( tate - 1);
				makeAbutton ("button_"+ (i + 1), 100 * konoYoko  + 50 , 50 * konoTate  + 50 , 10 , 0x11EE22 );
				//attachListeners ( "button_"+ (i + 1) );
			}
			
			// おまけで特別ボタンを作る
			makeAbutton ("tokubetsu_are", 50 , 400 , 30 , 0xFF0000);
			//attachListeners ( "tokubetsu_are" );
			
			stage.addEventListener (MouseEvent.MOUSE_DOWN, mouseDownEvent );
			stage.addEventListener (MouseEvent.MOUSE_UP, mouseUpEvent );
			// 以下2行は、wonderflではうまく動かないのでコメントアウトしてあります。
			// Please uncomment the following two lines when using this script in the flash or flex application.
			// stage.addEventListener (MouseEvent.MOUSE_OUT, mouseOutEvent );
			//stage.addEventListener (MouseEvent.MOUSE_OVER, mouseOverEvent );
        }
        
        private function mouseUpEvent (me : MouseEvent ) : void {
        		tf_messageField.text = "マウス アップです";
        		
        }
        
        private function mouseOverEvent (me : MouseEvent ) : void {
        		var buttonName : Array = me.target.name.split ('_') ;
        		if (!buttonName) return;
        		tf_messageField.text = "ボタン名 " + buttonName[1] + " ロールオーバー";
        		
        }
        
        private function mouseOutEvent (me : MouseEvent ) : void {
        		var buttonName : Array = me.target.name.split ('_') ;
        		if (!buttonName) return;
        		tf_messageField.text = "ボタン名 " + buttonName[1] + " ロールアウト";
        }
        
        private function mouseDownEvent (me : MouseEvent ) : void {
        		// wonderflではたぶん起こらないけど、flashなどでは
        		// 空白部分〜stage 等を拾うとエラーが出る・その対策
        		if (!me.target.name) return;
        		// ここでボタン名を取得しています
        		var buttonName : Array = me.target.name.split ('_') ;
        		tf_messageField.text = buttonName[1];
        		// button の prefix は buttonName[0] に代入される
        		// button の名前 は buttonName[1] に代入される
        		if (!buttonName) return; // ゴミよけ
        		
        		// button 系列のボタン
        		if (buttonName[0] == "button") {
	        		switch (buttonName[1]) {
	        			case "1":
	        				tf_messageField.text = "このボタン は 1 です。";	
	        				break;
	        			case "2":
	        				tf_messageField.text = "このボタン は 2 です。";		
	        				break;
	        			case "6": // このデモでは、ボタン”6”に反応
	        				tf_messageField.text = "6番のボタンが押されているので、このメッセージが特別に表示されています。";
	        				break;
	        			default: // その他のボタンはこちらに落ちる
	        				tf_messageField.text = "ボタン名:" + buttonName[1] + " が押されています";
	        				break;
	        		}
        		}
        		
        		// tokubetsu (特別)系列のボタン
       		if (buttonName[0] == "tokubetsu") {
	        		switch (buttonName[1]) {
	        			case "are": // 特別ボタンに反応
	        				tf_messageField.text = "特別ボタンが押されています。";
	        				break;
	        			default: // その他のボタンはこちらに落ちる
	        				// 特に何も無いので、何もしないでブレークする
	        				break;
	        		}
        		}
        		       		
        		// デバッグ用
        		// tf_messageField.text = "ボタン名:" + buttonName[1] + " ボタンの識別用コード" + buttonName[0];
        }
        
        private function makeAbutton (buttonMei : String, zahyouX : Number, zahyouY : Number , ookisa :  Number , iro : uint) : void {
        		var temp_mc : MovieClip = new MovieClip ();
        		stage.addChild( temp_mc );
        		temp_mc.x = zahyouX ;
        		temp_mc.y = zahyouY ;
        		temp_mc.buttonMode = true ;
        		temp_mc.name = buttonMei;
        		var shape_ichigen : Shape = new Shape();
			temp_mc.addChild( shape_ichigen );
			var g : Graphics = shape_ichigen.graphics;
			g.lineStyle (1, 0x000000, 1.0);
			g.beginFill (iro , 1.0);
			g.drawCircle  ( 0 , 0 , ookisa );
			shape_ichigen.name = buttonMei;
			var tf_buttonMeiField : TextField = new TextField ()
			tf_buttonMeiField.type = "dynamic";
			tf_buttonMeiField.text = buttonMei;
			tf_buttonMeiField.width = 70 ;
			tf_buttonMeiField.height = 20 ;
			tf_buttonMeiField.border = true ;
			tf_buttonMeiField.mouseEnabled = false ;
			tf_buttonMeiField.selectable = false ;
			temp_mc.addChild( tf_buttonMeiField );
        }
        
        private function makeMessageField () : void {
        		tf_messageField = new TextField ();
        		tf_messageField.type = "dynamic";
        		tf_messageField.width = 400;
        		tf_messageField.height = 40;
        		tf_messageField.wordWrap = true;
        		tf_messageField.mouseEnabled = false;
        		tf_messageField.text = "詳しいことはコメント欄を御覧下さい。";
        		addChild( tf_messageField );
        }
        
        private function attachListeners ( buttonMei : String) : void {
        		// mouse_over や roll_over はそれぞれ違うらしいです。
        		// http://blog.flair4.jp/2007/12/-as30-mouse-overroll-over.html
        		// ついでですが、getChildByNameを使えば、一旦ステージに出てしまって
        		// 捕まえるのが難しくなってしまった野良MCでも、名前で呼んでやって個別に指示を出すことも出来ます。
        		var target_mc : Object = stage.getChildByName ( buttonMei ) ;
        		if (!target_mc) return;
        		target_mc.addEventListener (MouseEvent.ROLL_OVER, mouseOverEvent );
			target_mc.addEventListener (MouseEvent.ROLL_OUT, mouseOutEvent );
        }
    }
}