dポイントプレゼントキャンペーン実施中!

AC3で開発を行っております。


複数のオブジェクト(変数の種類は同じ)を配列で確保し、
一気に処理をしようとしているのですが、引数の動作がうまくいきません。

以下が問題のソースです。

var peat:Array ;
var fg1:Object = new Object();
var fg2:Object = new Object();

fg1 = { _sp:Sprite, _img:Loader , _url:String , _x:int, _y:int };
fg2 = { _sp:Sprite, _img:Loader , _url:String , _x:int, _y:int };

peat = new Array( fg1 );
peat.push( fg2 );

for(i = 0;i < 2;i++)
{
// 値の代入

// クリック時の処理
peat[i].sp.addEventListener( MouseEvent.CLICK
, function(event:MouseEvent):void{
test(event, arguments.callee, peat[i]);
}
);
}

クリックしたときに それぞれのオブジェクトを参照したいのですが、
どちらも peat[2] を参照しているようなのです。
(for文の後に i=0 とすると先に設定したほうは正しく動作します。)

AC3での開発が初めてなので、変数の宣言から怪しいかも知れませんが
ご助力お願いいたします。

A 回答 (2件)

ちょっと乱暴なやり方ですが



// クリック時の処理
peat[i].sp.addEventListener( MouseEvent.CLICK
, function(event:MouseEvent):void{
test(event, arguments.callee, peat[i]);
}
);
}



peat[i].sp.addEventListener( MouseEvent.CLICK, function(ind){return function(event:MouseEvent){test(event, arguments.callee, peat[ind])}}(i) );


簡単に言うと関数を作る関数をその場で実行してる感じです
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お教えいただいた方法で、望みどおりの動作をしました。

お礼日時:2010/12/01 15:07

for文はループ終わった後に、その最終値を取ります。



例)
var i:uint
for (i=0; i<=2; i++) {
}
trace (i) // 2がtraceされます。

質問主さまの陥っている現象がまさにそれで、
peat[i].sp.addEventListener
この時点で
peat[2].sp.addEventListener
と同義になってしまいます。

これの回避法ですが、for でループさせている各ループ時のiをMcに記憶させる、等の方法があります。
例)
var i:uint;
for (i=0; i<2; i++) {
this["mc"+i].i = i; //各MCに自分自身に命令が出された瞬間のiを記憶させる
this["mc"+i].addEventListener(MouseEvent.CLICK , traceMyNumber);
}

function traceMyNumber(e:MouseEvent) {
trace (e.currentTarget.i); //自分自身のiをtrace。
}

しかしSpriteには上記のように内包する変数を追加出来ない為
(Spriteのプロパティ i を作成できません、のようなエラーが出てしまいます)
代替案を考えなければいけないかもしれません。(Mcにしてしまうのが手っとり早いです)

取り急ぎ何故iが2のみを見てしまうかだけは分かるといいなぁと><
ご確認下さい~。
    • good
    • 0
この回答へのお礼

ムービークリップを使用するご助言と、ソースの提供ありがとうございます。

どーしてもSpriteでというわけではないのですが、
出来るだけメモリは節約したいので、Spriteでの方法を探しておりました。

今後も、Spriteでの問題が浮上するようでしたら、ムービークリップに変更しようと思います。

ご回答ありがとうございました。

お礼日時:2010/12/01 15:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!