Think About it



Home > Blog

20080115

function(1)


ボタン等の処理をフレームアクションで書く場合。

今まではそのまま書いてました。

例:
押したボタンの番号を表示させる。

表示させる部分の関数は以下。(この部分は後ほども使い回します)
function testTxt(num){
test_txt.text = num;
}

本体は以下。
btn0.onPress = function(){ testTxt(0);}
btn1.onPress = function(){ testTxt(1);}
btn2.onPress = function(){ testTxt(2);}
btn3.onPress = function(){ testTxt(3);}
btn4.onPress = function(){ testTxt(4);}
btn5.onPress = function(){ testTxt(5);}
btn6.onPress = function(){ testTxt(6);}
btn7.onPress = function(){ testTxt(7);}
btn8.onPress = function(){ testTxt(8);}
btn9.onPress = function(){ testTxt(9);}



こんな感じで、列記していました。

これをもうちょっとスマートに、まとめて書けないものかと。
(これだと、増やしたり減らしたりするのにめんどう)

で、for文で単純に回してみました。

function setBtn(){
for( i = 0; i < 10; i++){
this["btn"+i].onPress = function(){ testTxt(i);}
}
}
setBtn();



で、結果を見ていただければわかる通り、おかしい、です。
どのボタンを押しても、「10」が表示されます。

色々試してみた結果、どうやら以下のようです(あくまで推測です)。
一度for文が回り終わってから、ボタンを押すことになります。
なので、ボタンが押されたときには、関数に渡しているiの値は、
for文が回ってからの値、すなわち、10(i=10になったら抜けるようになっているので)となり、
常に10が関数に渡されている、という事のようです。

なら、これはどうでしょうか。
function setBtn(){
for( i = 0; i < 10; i++){
this["btn"+i].onPress = function(){ mc_txt.text = this;}
}
}
setBtn();



これでは、押されたボタンのインスタンス名(レベルも含まれてます)が、表示されるようにしています。
これだと、for文で回しているにも関わらず、きちんと表示されています。

これは、先ほどの推測の通り、iを参照すると、for文が回ってしまった後のためおかしくなりますが、
thisだと、不変なため、正しく表示できているようです。

このことから、少しややこしい事をしている気もしますが、
以下のようにしてみます。

function setNum(mc){
var mcLength:Number = mc._name.length;
var mcNum:Number = mc._name.charAt(mcLength - 1);
testTxt(mcNum);
}
function setBtn(){
for( i = 0; i < 10; i++){
this["btn"+i].onPress = function(){ setNum(this);}
}
}
setBtn();



これは、インスタンス名は正しく取得できているところから、
そのインスタンス名の一番最後の文字から、ボタンの番号を抜き出してき、
それを関数に与えている、ということをしています。
これでとりあえず上手くいきました。

こうしてfor文で回すことによって、管理がしやすくなります。
以下のようにボタンを減らすことも容易です。
var max:Number = 5;
function setNum(mc){
var mcLength:Number = mc._name.length;
var mcNum:Number = mc._name.charAt(mcLength - 1);
testTxt(mcNum);
}
function setBtn(){
for( i = 0; i < max+1; i++){
this["btn"+i].onPress = function(){ setNum(this);}
}
}
setBtn();



ただし、付け焼刃的な対処のため、問題があります。

・ボタンのインスタンス名は、最後に連番となる数字をつけなければならない。
(今回のサンプルの場合だと、btn0 ~ btn9、となっています)
・数字は一桁までしか対応していない。
(10以上ボタンがある場合は対応できていません。少し改造すれば出来るようになるはずです。)

その他、諸所問題あると思います。

もっと簡単に出来るような気もしているんですけど、、、。
クラスとか使えば出来るんでしょうか。

Labels: ,

----------------------------------------------------------------------------------------------------