PDA

Просмотр полной версии : Странности цикла


sstotenkopf
12.10.2011, 01:32
Я конечно понимаю, что данный заголовок скорее подойдет для форумов с другой тематикой... Проблема именно в цикле...) Вопрос сугубо теоретический, но поверг меня в недоумение, попытаюсь вкратце описать.

Я добавляю объекты (box) используя распространенный цикл for, создаю обработчик, который при наведении на бокс выделяет его, выглядит примерно так:

public function friendsLoaded():void
{
for (i = 0; i < 6; i++)
{
add();
}
}

public function add():void {
//объект бокс, его свойства и т.д.
}

box.addEventListener(MouseEvent.ROLL_OVER, evnt);
box.addEventListener(MouseEvent.ROLL_OUT, evnt1);

function evnt(e:MouseEvent):void {
box.alpha = 0.5;
}

function evnt1(e:MouseEvent):void {
box.alpha = 1;
}


При наведении курсора на любой объект, выделяется именно он

если я не создаю доп. функцию, а делаю все непосредственно в цикле, так:

public function friendsLoaded():void
{
for (i = 0; i < 6; i++)
{
//объект бокс, его свойства и т.д.
}
}

box.addEventListener(MouseEvent.ROLL_OVER, evnt);
box.addEventListener(MouseEvent.ROLL_OUT, evnt1);

function evnt(e:MouseEvent):void {
box.alpha = 0.5;
}

function evnt1(e:MouseEvent):void {
box.alpha = 1;
}

выделяется самый крайний нижний объект, при наведении на любой... Логичный вопрос - почему?

illuzor
12.10.2011, 01:44
выделяется самый крайний нижний объект, при наведении на любой... Логичный вопрос - почему? Потому что вы выделяете последний созданный.

function evnt(e:MouseEvent):void {
e.currentTarget.alpha = 0.5;

}
function evnt1(e:MouseEvent):void {
e.currentTarget.alpha = 1;

}

crazyone
12.10.2011, 01:46
Потому что после прохождения цикла в переменной box хранится ссылка на последний объект из цикла.

sstotenkopf
12.10.2011, 01:47
но первый вариант то работает... как это объяснить?

Добавлено через 8 минут
Потому что вы выделяете последний созданный.

function evnt(e:MouseEvent):void {
e.currentTarget.alpha = 0.5;

}
function evnt1(e:MouseEvent):void {
e.currentTarget.alpha = 1;

}

Спасибо ваш вариант мне действительно помог, если бы не ошибочно правильно работающий скрипт, возможно нашел бы его раньше)

crazyone
12.10.2011, 02:57
в первом варианте в каждом шаге цикла создаются (локально для функции add) новые переменные box и новые слушатели evnt и evnt1

2Sun
12.10.2011, 11:36
public function friendsLoaded():void

{
for (i = 0; i < 6; i++)
{
//объект бокс, его свойства и т.д. }
box.addEventListener(MouseEvent.ROLL_OVER, evnt);
box.addEventListener(MouseEvent.ROLL_OUT, evnt1);
}
}



function evnt(e:MouseEvent):void {
box.alpha = 0.5;

}
function evnt1(e:MouseEvent):void {
box.alpha = 1;

}

Newred
12.10.2011, 19:27
// init Listener
addEventListener(MouseEvent.ROLL_OVER, roll_over);
addEventListener(MouseEvent.ROLL_OUT, roll_out);

public function friendsLoaded():void
{
for (i = 0; i < 6; i++)
{
//объект бокс, его свойства и т.д. }
}
}

private function roll_over(e:MouseEvent):void {
e.target.alpha = 0.5;

}
private function roll_out(e:MouseEvent):void {
e.target.alpha = 1;

}

2Sun
12.10.2011, 23:35
[QUOTE=Newred;1038688]

А вдруг на сцене еще и кружочки будут кроме квадратиков? А им другие обработчики...