PDA

Просмотр полной версии : Цикл for и что-то необъяснимое


sokiche
13.02.2007, 22:22
trace (counter) при клике всегда выдает 4...
почему???
и как заставить выдавать 1 при клике по первому, 2 по второму и т.д.?

for (counter = 1; counter <= 3; counter++) {
currentImgBut = "imgBut" + counter;
_root.imageNum.attachMovie("imgBut", currentImgBut, _root.imageNum.getNextHighestDepth());
_root.imageNum[currentImgBut].imgNumText.text = counter;
_root.imageNum[currentImgBut]._x = _root.imageNum[currentImgBut]._width * counter;
_root.imageNum[currentImgBut].onRelease = function () {
//_root.galleryLoader.loadClip (counter + ".jpg", _root.galleryImages);
trace (counter);
}
}

sokiche
13.02.2007, 22:30
Даже если написать так

for (counter = 1; counter <= 3; counter++) {
_root.imageNum["imgBut" + counter].onRelease = function () {
_root.galleryLoader.loadClip (counter + ".jpg", _root.galleryImages);
}
}

counter все-равно равен четырем... :rtfm: :taunt:

Apeyron
13.02.2007, 23:29
Это потому что сначала плеер пройдет цикл и только потом он вернеться к обработчикам событий(это видно в дебагере)...

for (counter = 1; counter <= 3; counter++) {
_root.imageNum["imgBut" + counter].onRelease = function () {
for(counter2=1;counter2<=3;counter2++){
_root.galleryLoader.loadClip (counter2 + ".jpg", _root.galleryImages);
}
};
}


Не очень красиво, но работает...

sokiche
13.02.2007, 23:57
Все время 3 выдает.
Т.е. нет ни 1, ни 2, а только 3.

kmkhi
14.02.2007, 00:30
попробуй им всем ставить разные имена и на клик выдавать ответ в зависимости от имени. а имена нужно всегда давать разные

etc
14.02.2007, 00:57
Все верно, после выполнения цикла значение counter будет равно четырем. Именно эту переменную вы трейсите. Нужно делать так:

for (counter = 1; counter <= 3; counter++) {
currentImgBut = "imgBut" + counter;
var mc = _root.imageNum.attachMovie("imgBut", currentImgBut, _root.imageNum.getNextHighestDepth());
mc.imgNumText.text = counter;
mc._x = _root.imageNum[currentImgBut]._width * counter;
mc.id = i;
mc.onRelease = function () {
trace (this.id);
}
}

sokiche
14.02.2007, 01:22
Обалдеть!
Спасибо! Работает.

Что-то я в доках ID не видел.

pkfun
14.02.2007, 01:38
Его и нет. Это новое свойство, которое создается динамически для каждого мувиклипа и сохраняет текущее значение counter.

__etc
А можно как-то без добавления нового свойства? :)

etc
14.02.2007, 01:49
Можно. Но MovieClip — динамический класс. С id вернее было бы.
mc.onRelease = function() {
trace(Number(this._name.substr(6)));
}

Лично я бы сделал подкласс MovieClip с заданным свойством id.

pkfun
14.02.2007, 01:55
Да-да. Я тоже сейчас задумался над этим. :) Только взвешиваю, можно сказать, трудозатраты. Создавать дин. свойство проще...

lowka
14.02.2007, 01:58
Еще можно использовать Proxy/Delegate для этого.

sokiche
14.02.2007, 02:03
Подскажите, пожалуйста, что значит "я бы сделал подкласс MovieClip с заданным свойством id."

В том смысле, где это копать?
Хочется код писать "красивый", да и научиться новому всегда приятно.

etc
14.02.2007, 02:07
Подскажите, пожалуйста, что значит "я бы сделал подкласс MovieClip с заданным свойством id."

В том смысле, где это копать?
Хочется код писать "красивый", да и научиться новому всегда приятно.
Для этого потребуется переписать весь твой проект на AS2.

pkfun
14.02.2007, 02:07
Чтобы понять, о чем разговор вам нужно вникнуть в теорию ООП. Есть хорошая книжка Колина Мука про все это.
Быстро не получится. Хотя кто вас знает... :)

Вот название книги:
Основы ActionScript 2.0 (Колин Мук)
и ссылка на блог Kuzen-а - http://www.flashblog.ru/?page_id=4
Там еще есть полезные книжки.

Лично я ООП не применяю, но книжку эту время от времени читаю.

sokiche
14.02.2007, 02:11
Понятно. Объекто Ориентированное Прграммирование.

Я думал что сейчас я как раз на ас2 =)
Думал что это простоновая версия языка для флеш.

Вот же я деревня.

etc
14.02.2007, 02:50
Я думал что сейчас я как раз на ас2 =)
Это другая идеология. AS2 — это не только типизированный код.

http://www.flash-ripper.com/archives/000304.htm