Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Цикл: неправильный счет (http://www.flasher.ru/forum/showthread.php?t=108884)

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

Спасибо, работает.
Цитата:

Сообщение от iNils
1. Персонально вам говорю, перед вставкой код, форматируйте его. Собюлюдайте табуляцию, ставте между операндами пробелы и тп.

ок, учту
Цитата:

Сообщение от iNils
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, я уже понял, еще раз спасибо ;)


Часовой пояс GMT +4, время: 14:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.