Я согласен с wpjmurray, что это вовсе не недостаток; скорее это результат работы контекста в EcmaScript.
Ваш обработчик кликов содержит неявную ссылку на переменную (n
). Когда функция вызывается (вызывается щелчком), значение этой переменной изменилось. Это имеет смысл, когда вы думаете об этом таким образом.
Решение состоит в том, чтобы хранить значение на каждой итерации и каким-то образом связывать его с вашей кнопкой. Есть три хороших способа сделать это:
- Создать новое замыкание, которое само имеет неявную ссылку на другую переменную, значение которой устанавливается один раз, а затем остается в покое. Решение back2dos - это один из способов сделать это:
makeFunction
создает закрытие нового метода, которое имеет неявную ссылку на новую переменную (makeFunction
'n
аргумент), которая не изменяется.
- Сохранить значение как свойство объекта. (Это то, что предложил wpjmurray, но вы не можете этого сделать.)
- Сохраните значение на карте и найдите его. Вы намекали на это, когда упоминали отображение координат X / Y на индекс. Тем не менее, ActionScript 3 предоставляет гораздо более… элегантный (: решение: Класс словаря ! Просто сопоставьте сам объект с индексом, а затем найдите его в обработчике.
Вот пример:
var dict:Dictionary = new Dictionary(true);
for (var a:int = 0; a < 5; a++) {
for (var b:int = 0; b < 10; b++) {
var n = (a * 10) + b + 1;
var btt:SimpleButton = new BasicGameButton();
btt.x = 20 + b * 50;
btt.y = 50 + a * 80;
addChild(btt);
dict[btt] = n;
btt.addEventListener(MouseEvent.CLICK, function f(event:MouseEvent) { trace(dict[event.currentTarget]); } );
}
}
Из-за того, как работает область в EcmaScript, каждый созданный вами обработчик кликов содержит неявную ссылку на словарь, который вы можете использовать для поиска индекса. Теперь индекс отображается непосредственно на кнопку, без необходимости добавлять свойство или создавать новую функцию.