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