0

ゲームのリーダーボードを作成しています。このリーダーボードは配列からスコアを取得します。しかし、eventListener を追加すると、配列からオブジェクトを 1 つだけ取得します。これは私のオブジェクト配列です:

[{gamenr:1,naam:"wilbert", score:60},{gamenr:1,naam:"joost", score:20},
{gamenr:2,naam:"harry", score:50},{gamenr:2,naam:"john", score:10},
{gamenr:3,naam:"carl", score:30},{gamenr:3,naam:"dj", score:16}]

コード:

public function toonHighscoreArray():Array {
highScoreTabel.sortOn(["score"], [Array.NUMERIC]).reverse();//get highest score on top
var returnArray:Array = new Array();
for ( var i:int = 0; i < 6; i++ ) {
    var scores:TextField = new TextField();
    scores.addEventListener(MouseEvent.CLICK, function(e:MouseEvent){toon2deSpeler(highScoreTabel[i])});

    scores.y = (i * 50) - 50;
    scores.height = 50;
    scores.text = "" + (i + 1) + ".\t" + highScoreTabel[i].naam + " met " + highScoreTabel[i].score + " punten.";
    scores.autoSize = "left";

    returnArray.push(scores);
}
return returnArray;
}

private function toon2deSpeler(score:Object) {
    trace(score.naam);
}

関数 toon2deSpeler で、ウィルバートがテキストフィールドにあるテキストフィールドをクリックするとウィルバートがトレースされ、ハリーのテキストフィールドがクリックされたときにハリーがトレースされます

しかし、ウィルバートをクリックすると元気が出ますが、ハリーやジョストなどをクリックしても元気になります。

toon2deSpeler のパラメータとして適切なオブジェクトを取得するにはどうすればよいですか?

4

2 に答える 2

3

ループ内のクロージャは期待どおりに機能しません。イベントハンドラが呼び出されると、最後の値であるが使用されますi

forループを次のように変更します。

for ( var i:int = 0; i < 6; i++ ) {
    var scores:TextField = new TextField();
    addScoreListener(scores, i);

    scores.y = (i * 50) - 50;
    scores.height = 50;
    scores.text = "" + (i + 1) + ".\t" + highScoreTabel[i].naam + " met " + highScoreTabel[i].score + " punten.";
    scores.autoSize = "left";

    returnArray.push(scores);
}

private function addScoreListener(score:TextField, index:int):void
{
   scores.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void{
       toon2deSpeler(highScoreTabel[index]);
   });
}
于 2013-03-16T15:30:56.393 に答える
0

関数は作成されたスコープで実行されるため (関数スコープに関するこのページを参照)、インライン リスナーは次のようになります。

function(e:MouseEvent){toon2deSpeler(highScoreTabel[i])}

の「独自の」コピーではなく、 ifromを使用しています。ただし、そこにコードがあると、highScoreTabel[6] にアクセスしようとしているときに、"joost" ではなく null オブジェクト参照を取得することになります。toonHighscoreArray()i

TextFieldのプロパティを使用してオブジェクトを拡張および作成しhighScoreTabel、Barış Uşaklı の方法を使用することを強くお勧めします。ただし、次のように、各リスナー関数を独自のスコープで作成することは可能です。

function getScoreClickListener(scoreID:uint):Function {
    return function(e:MouseEvent){toon2deSpeler(highScoreTabel[scoreID])}
}

次に、偶数リスナーを追加するときにそれを使用します。

scores.addEventListener(MouseEvent.CLICK, getScoreClickListener(i));

ただし、これにより、後でイベント リスナーを削除することが難しくなるため、それらを個別に追跡する必要があります。

于 2013-03-16T15:40:13.313 に答える