- 2006-12-29 (金)
- action script
独学でプログラムを勉強してきたので、時々、ありえないぐらい初歩的なことを知らなかったりします。今回紹介するのは、最近、恥を忍んで人に聞いて、火が出るぐらい恥ずかしい思いをしたコーディングです。
今回作りたいのはこれ。
各ボタンを押したら、各自の番号を出力するサンプルです。
それでは次のコードはどうなるでしょう?
for (var i:Number = 0; i<=5; i++) { //"mc_0"~"mc_5"を作成。 var mc = this.createEmptyMovieClip("mc_"+i, i); //各MCの深度1にリンケージシンボル"btn"を"btn_0"~"btn_5"として作成。 var btn = mc.attachMovie("btn", "btn_"+i, 1); //ボタンにナンバリング。 btn.num.text = i; //各MCをレイアウト。 mc._x = 50*(i+1); mc._y = 200; //ここから注目!--------------- mc.onPress = function() { _root.textBox.text = i; }; //------------------------ }
上のサンプルをパブリッシュすると、次のようになります。
どのボタンをおしても同じ数"6"が出力されますね。ボタンを押すのはfor文が全部回りきった後なので、全てのループ終了後の i の値になるわけです。これは困ります。
話は脱線しますが、参考までに、なぜ"6"になるのでしょうか。これはfor文の評価の仕方を知っておく必要があります。こちらのサイトでも解説されていますが、上のコードの場合、for文は0から始まり、順にi++され、5になったところで最後のforループ処理が実行され、さらにi++されiが6になり、条件を評価、i<=5を満たしていないので、そこでfor文の処理が終了されるのです。よってiは6になっているわけです。
話を戻して、きちんと0~5のボタンを押したら各数値が出力されるようにしましょう。
お恥ずかしい話ですが、僕は今まで、インスタンス名が"mc_1"とかだったら、こちらのサイトの方のように、
this._name.split(”_”)[1];
とかで、アンダースコア以降の値を取得するという面倒なことをしていたのです。じゃあ"mc_01"の時は?アンダースコアがない時は?といろんな状況に出くわしてきましたが、上記リンクの方と同様に、if文を駆使してなんとか切り抜けてきたのですが、こんなことする必要はありませんでした。さきほどのコードの「注目」部分を
//ここから注目!--------------- mc.index = i; mc.onPress = function() { _root.textBox.text = this.index; }; //------------------------
このように、インスタンス生成時に、各MCに変数としてインデックス値を持たせればよかったんです。
以上、いまさら解説するのもお恥ずかしいのですが、僕と同じ穴をお持ちの方のためにエントリしてみました。
- Newer: 新年おめでとうございます
- Older: 日記
Comment:2
- サトコン 2007-11-08 (木) 04:18
-
いきなりの投稿失礼いたします。
今頃まったく同じ問題で悩んでいます。もしお時間ありましたら、ご返答いただきたいとおもっています。
下記空のMCに画像を読み込み、それをボタン設定し、ボタンを押すと他のMCに大きな画像が読み込まれるというフォトギャラリーをさくせいしています。
読み込み、ボタン設定までは、動いているのですが、
どのボタンをおしても同じ画像が出てきてしまいます。よろしければ、何かヒントをいただけますでしょうか?var thumbs:Array = new Array ();
var mcl:MovieClipLoader = new MovieClipLoader ();
var obj:Object = new Object ();
var target:Number = 0;
var speed:Number = 2;
obj.onLoadInit = function () {
for (var i = 1; i thumbs[i] = _root["thumb" + i];
_root["thumb" + i]._y = 400;
thumbs.index = i;
_root["thumb" + i].onRelease = function(){
trace("2:"+this._name);
_root.load_mc.loadMovie("images/" + i + "_t.jpg", this.index);
}
//trace (_root["thumb" + i]._y);
////fadeIn ();
_root["thumb" + i].onEnterFrame = fadeIn;
}
};
function fadeIn (){
this._y += (220 - this._y) / speed;
//this._alpha -= 33.33
}
mcl.addListener(obj);
for (var i=1; i //_root.createEmptyMovieClip("thumb" + i , i);
var thumbs:MovieClip = _root.createEmptyMovieClip("thumb" + i , i, mc.getNextHighestDepth());
//var thumbs:MovieClip = _root.attachMovie("thumb" + 1, "thumb" , i);
mcl.loadClip("img/" + i + ".jpg", _root["thumb" + i]);
_root["thumb" + i]._x = ((i - 1)%20)*40;
//_root["thumb" + i]._y = Math.floor((i - 1)%20)*20;
trace("1:"+_root["thumb" + i]._name);
}
- tera 2007-11-08 (木) 08:14
-
こんにちは。僕のブログのコメント欄は「不等号記号」を「<(アンドエルティーセミコロン)」指定しないとちゃんと表示されないのでfor条件式が上手く表示されてないと思いますが、さっと拝見したところ:
とりあえず12行目
_root.load_mc.loadMovie("images/" + i + "_t.jpg", this.index);
を
_root.load_mc.loadMovie("images/" + this.index + "_t.jpg", this.index);
にしましょうということを記事中で書いてるわけです。
なんといいましょうか、『後で呼び出されるようなやつは、forで最後までカウントアップが終わってしまった「i」ではなくて、「this.index」を参照する』という感じですー。そういうルールで他の箇所(もしあれば)もやってみればいいのではないでしょうかと思いました。
とりいそぎ。
Trackback:0
- TrackBack URL for this entry
- http://www.trick7.com/blog/mt-tb.cgi/438
- Listed below are links to weblogs that reference
- 各MCにインデックスナンバリング from trick7.com blog




