PDA

Просмотр полной версии : Цикл: неправильный счет


TanaTiX
02.03.2008, 22:01
Сабж.
for (n = 2; n <= 6; n++){
_root.top_menu["top_b" + n].onPress = function(){
trace(n);
}
}
При нажатии на соответствующую кнопку выдает 7. Т.е. с самого начала ролика происходит счет до 6, а потом при нажатии плюсуется еще 1 и выносится в трэйс.
Что не правильно(желательно с объяснениями) в этом коде и как это исправить?

iNils
02.03.2008, 22:12
1. Персонально вам говорю, перед вставкой код, форматируйте его. Собюлюдайте табуляцию, ставте между операндами пробелы и тп. Это упрощает чтения кода глазами, а у вас каша.
2. Избегайте писать конструкции n <= 6, пишите лучше n < 7
3. for (n = 2; n < 7; n++) {
_root.top_menu["top_b" + n].n = n;
_root.top_menu["top_b" + n].onPress = function () {
trace (this.n);
};
}

udaaff
02.03.2008, 22:14
for (n = 2; n < 7; n++) {
var top_b = _root.top_menu["top_b" + n];
top_b.n = n;
top_b.onPress = function() {
trace(this.n);
}
}

TanaTiX
02.03.2008, 22:21
Спасибо, работает.
1. Персонально вам говорю, перед вставкой код, форматируйте его. Собюлюдайте табуляцию, ставте между операндами пробелы и тп.
ок, учту
2. Избегайте писать конструкции n <= 6, пишите лучше n < 7
Почему?
И если не сложно, можно объяснить 2ю строчку кода?

Mr. Fixit
02.03.2008, 22:33
MovieClip - динамический клас. И ты просто создаешь ему свойство, в даном случае, n и присваиваешь текущее числовое значение.

iNils
02.03.2008, 22:38
Почему?Простая оптимизация, <= требует чуть больше операций (на уровне байт кода), чем <.

И если не сложно, можно объяснить 2ю строчку кода?В строки trace(n); n это имя переменной изменяемое циклом, а не ее значение.
Поэтому втроая строчка создает локальную переменную внутри кнопки и присваивает ее текущие значение n цикла.
То есть у вас на самом деле два n: локальное в кнопке и у предка.

TanaTiX
02.03.2008, 23:58
У меня внутри мувика при нажатии должна проигрываться анимация. Я по аналогии внутри цикла ввожу:
top_b.menu_title_mc.gotoAndPlay(21);
Но тем не менее ничего не проигрывается, т.е. в данному случае top_b опять воспринимается как глобальная переменная, а не как свойство мувика. Что нужно исправить?

udaaff
03.03.2008, 00:04
this.menu_title_mc.gotoAndPlay(21);

TanaTiX
03.03.2008, 00:14
udaaff, я это пробовал, но не работает. Если написать тот код, который я написал вначале, то срабатывает не на нажимаемой кнопке, а только на последней из списка однотипных

udaaff
03.03.2008, 00:24
Должен срабатывать...
for (n = 2; n < 7; n++) {
var top_b = _root.top_menu["top_b" + n];
top_b.n = n;
top_b.onPress = function() {
trace(this.n);
this.menu_title_mc.gotoAndPlay(21);
}
}

TanaTiX
03.03.2008, 00:29
Должен... Все выглядит именно так. Но код сам по себе работает, а так - нет. Точнее вся сцена работает как надо, но анимация не проигрывается. А вот если по отдельности, вне цикла, нормально.

udaaff
03.03.2008, 00:40
Значит ошибка где-то в другом месте.

upd: menu_title_mc -- это мувик, который находится в _root.top_menu["top_b" + n]?

TanaTiX
03.03.2008, 00:45
Нет ошибки. Нет другого кода. Только прелоадер, но там все чисто. Точнее ошибка есть, раз не работает. :(
Только что убил прелоадер - без него тот же результат.

iNils
03.03.2008, 01:08
Что выдает трейс в таком случаи?
for (n = 2; n < 7; n++) {
var top_b = _root.top_menu["top_b" + n];
top_b.n = n;
top_b.onPress = function () {
trace (this.n);
trace (this.menu_title_mc);
};
}

TanaTiX
03.03.2008, 01:17
iNils, udaaff, суть проблемы заключалась в развернутом написании кода (тот что в самом начале писал iNils), вот если туда добавить "this", то получается, а сокращенный вариант не прокатывает (и если подумать - понятно почему)
Так что спасибо за помощь.
=======================================
Загадки продолжаются.
for ( k = 7 ; k < 10 ; k++) {
_root["left_b" + k].k = k;
_root["left_b" + k].onRollOut = function() {
_root["left_b" + k].menu_title_mc.onEnterFrame = function() {
_root["left_b" + this.k].menu_title_mc.prevFrame();
if (_root["left_b" + this.k].menu_title_mc._currentframe == 1) {
delete _root["left_b" + this.k].menu_title_mc.onEnterFrame;
}
};
}
}
Этот код не срабатывает. В результате тестов определено что функция запускается, но не работает: анимация назад не проигрывается. Ну и как всегда в самостоятельном виде все работает.

Mr. Fixit
03.03.2008, 04:43
for (k = 7; k < 10; k++) {
_root["left_b" + k].val = 0;
_root["left_b" + k].k = k;
_root["left_b" + k].onRollOver = function () {
this.onEnterFrame = function () {
if (this._x <= 50) {
delete this.onEnterFrame;
delete this.onRollOver;
}
this.val += this.k/5;
this._x -= this.val;
};
};
}

TanaTiX
03.03.2008, 04:57
Mr. Fixit, да, кнопочки двигаются, хотя и нужно не это, но самое печальное - кнопки при этом не работают.
Помочь, не помогло, но зато навел на правильную мысль:
this.onEnterFrame=function() и delete this.onEnterFrame; вместо полного пути решили проблему. Спасибо.

Mr. Fixit
03.03.2008, 05:00
тоесть не работают?
да и в чем состоит проблема прикрутить ваши 2 строчки?
я показал принцип построения синтаксиса.

TanaTiX
03.03.2008, 05:04
Mr. Fixit, я уже понял, еще раз спасибо ;)