0

我正在为游戏制作排行榜。此排行榜从数组中获取分数。但是当我添加 eventListener 时,我只从数组中得到一个对象。这是我的对象数组:

[{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 在单击 wilbert 在文本字段中的文本字段时跟踪 wilbert 并在单击 harry 的文本字段时跟踪 harry

但是当我点击 wilbert 时它给了我 joost,当我点击 harry 或 joost 等时它也给了我 joost。

如何在 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 toonHighscoreArray(),而不是它的“自己”副本i。但是,鉴于您的代码,您将获得一个空对象引用而不是“joost”,因为您正在尝试访问 highScoreTabel[6]。

我真的建议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 回答