Просмотр полной версии : Цикл: неправильный счет
Сабж.
for (n = 2; n <= 6; n++){
_root.top_menu["top_b" + n].onPress = function(){
trace(n);
}
}
При нажатии на соответствующую кнопку выдает 7. Т.е. с самого начала ролика происходит счет до 6, а потом при нажатии плюсуется еще 1 и выносится в трэйс.
Что не правильно(желательно с объяснениями) в этом коде и как это исправить?
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);
};
}
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);
}
}
Спасибо, работает.
1. Персонально вам говорю, перед вставкой код, форматируйте его. Собюлюдайте табуляцию, ставте между операндами пробелы и тп.
ок, учту
2. Избегайте писать конструкции n <= 6, пишите лучше n < 7
Почему?
И если не сложно, можно объяснить 2ю строчку кода?
Mr. Fixit
02.03.2008, 22:33
MovieClip - динамический клас. И ты просто создаешь ему свойство, в даном случае, n и присваиваешь текущее числовое значение.
Почему?Простая оптимизация, <= требует чуть больше операций (на уровне байт кода), чем <.
И если не сложно, можно объяснить 2ю строчку кода?В строки trace(n); n это имя переменной изменяемое циклом, а не ее значение.
Поэтому втроая строчка создает локальную переменную внутри кнопки и присваивает ее текущие значение n цикла.
То есть у вас на самом деле два n: локальное в кнопке и у предка.
У меня внутри мувика при нажатии должна проигрываться анимация. Я по аналогии внутри цикла ввожу:
top_b.menu_title_mc.gotoAndPlay(21);
Но тем не менее ничего не проигрывается, т.е. в данному случае top_b опять воспринимается как глобальная переменная, а не как свойство мувика. Что нужно исправить?
this.menu_title_mc.gotoAndPlay(21);
udaaff, я это пробовал, но не работает. Если написать тот код, который я написал вначале, то срабатывает не на нажимаемой кнопке, а только на последней из списка однотипных
Должен срабатывать...
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);
}
}
Должен... Все выглядит именно так. Но код сам по себе работает, а так - нет. Точнее вся сцена работает как надо, но анимация не проигрывается. А вот если по отдельности, вне цикла, нормально.
Значит ошибка где-то в другом месте.
upd: menu_title_mc -- это мувик, который находится в _root.top_menu["top_b" + n]?
Нет ошибки. Нет другого кода. Только прелоадер, но там все чисто. Точнее ошибка есть, раз не работает. :(
Только что убил прелоадер - без него тот же результат.
Что выдает трейс в таком случаи?
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);
};
}
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;
};
};
}
Mr. Fixit, да, кнопочки двигаются, хотя и нужно не это, но самое печальное - кнопки при этом не работают.
Помочь, не помогло, но зато навел на правильную мысль:
this.onEnterFrame=function() и delete this.onEnterFrame; вместо полного пути решили проблему. Спасибо.
Mr. Fixit
03.03.2008, 05:00
тоесть не работают?
да и в чем состоит проблема прикрутить ваши 2 строчки?
я показал принцип построения синтаксиса.
Mr. Fixit, я уже понял, еще раз спасибо ;)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.