PDA

Просмотр полной версии : Не видно глобальной переменной из мувика


manas
12.04.2006, 22:32
Есть файл - нечто типа фотоальбома с превью: Один "основной" муви-клип, в который грузятся фотки this.pics.loadMovie("img/Image"+glob+img+".jpg"); и 6 мелких мувиков, в которые подгружаются превью этих фоток по циклу for(i=1;i<=7;i++){
this["pp"+i].loadMovie("tumbs/p"+glob+i+".jpg");
} Их имена при загрузке формируются из глобальной переменной (glob) и локальной (img или i).Две кнопки: "Next" и "Back", при клике на которые значение global меняется на 1 и грузятся новые фото и превью on(release){
_global.glob = glob++;
trace("glob"+glob);
img = glob + 1;
this.pics.loadMovie("img/Image"+glob+img+".jpg");
for(i=1;i<=7;i++){
this["pp"+i].loadMovie("tumbs/p"+glob+i+".jpg");

}
}
На муви-клипы(превью) навешена функция загрузки изображения в основной мувик и здесь их имена генерируются из названия глобала и самого мувика, на который кликнулиon(Release){
var n:String
n = _name;
m=n.substring(2);
//trace(n);
//trace(m);
_root.pics.loadMovie("img/Image"+glob+m+".jpg");
}
Проблема в том, что из превью глобальная функция определяется с запозданием, то есть если кликнуть на "Next", то в мувики загружается то, что нужно, а вот при клике на превью - картинки с предыдущим индексом global... вот
Как быть-то? Что сделать, чтобы значение global обновлялось вовремя в скрипте муви-клипов?
Особое спасибо тем, кто дочитал всё это до конца:rolleyes:

iNils
12.04.2006, 23:10
Смени
_global.glob = glob++;
на
_global.glob++;

iNils
12.04.2006, 23:14
В качестве работы над ошибками.
В новом файле наиши код
_global.glob = glob++;
_global.glob = glob++;
trace (_global.glob + " " + glob);
И попробуй понять почему трейс даст 1 2, а не 2 2

manas
12.04.2006, 23:41
пробовал...
тогда вообще global не изменяется...

iNils
13.04.2006, 02:15
Только исходник спасет отца русской демократии.

manas
13.04.2006, 15:17
Не вопрос ;)

iNils
13.04.2006, 18:46
смени код

if(glob=0){
_root.prev_chapter._visible = false;
}
на
if(glob==0){
_root.prev_chapter._visible = false;
}

manas
13.04.2006, 19:15
а... точно! спасибо большое =)))

manas
13.04.2006, 19:38
только в кадре эта функция срабатывает один раз - я её в отдельный мувик засунул, чтобы постоянно условие проверялось: onClipEvent(enterFrame){
if(glob==0){
_root.prev_chapter._visible = false;
}
else {
_root.prev_chapter._visible = true;
}
}- а там та же песня, что и с превью: global с опозданием обновляется...
шьёрт... где же я неправ?...

Whatsername
14.04.2006, 04:18
_global.glob = glob++;
_global.glob = glob++;
trace (_global.glob + " " + glob);
Вот чего я не могу понять, так это почему
_global.glob = glob++; // undefined

Как я думаю: glob в области видимости клипа приводится к числовому типу (нулю), возвращает свое значение (0), инкрементирует свое значение (1). Но _global.glob получает undefined, значит "все это мне только померещилось". Не мог бы ты объяснить логику скрипта?

iNils
14.04.2006, 12:19
Смотрим
// код 1
_global.glob = 10;
// код 2
trace (_global.glob + " " + glob);
// код 3
glob = 300;
// код 4
trace (_global.glob + " " + glob);
// код 5
delete glob
// код 6
trace (_global.glob + " " + glob);
получаем
10 10
10 300
10 10
Почему так происходит:
Сначала мы создаем глобальную переменую [1], при попытке вывести просто glob [2] флеш ищет по цепочке вверх и находит переменую в _global. Когда присваеваем новое значение [3], то мы на самом деле создаем новую переменную в таймлайне, поэтому при попытке вывести просто glob [4] флеш не идет вверх, так как находит имя переменной в таймлайне. Это легко проверить заглянув в дебаггер. Там найдете одну переменную в _global, а одну в _level0. Теперь удалим просто glob [5] и увидим что при его попытке вывести, флеш опять не находит его в таймлане и идет выше до _global.

Почему
// код 1
_global.glob=5
// код 2
_global.glob = glob++;
trace (_global.glob + " " + glob);
выдает 5 6

Мы создаем глобальную переменную [1], а потом, по аналогии с тем что я писал выше, опять создаем новую переменную в таймлане [2], но varible++ это постфиксное инкременирование, то есть сначала мы используем переменную, а уж потом ее увеличиваем на 1. Поэтому _global.glob получает значение glob (которая еще пока береться из _global), а потом создается таймлайновый glob с увеличенным значением. Поэтому надо использовать префисное инкременирование ++varible. Тогда _global.glob и glob будут равны.

Хотя зачем делать _global.glob=++glob тоже не ясно. Можно ведь сделать _global.glob++ :)

Whatsername
14.04.2006, 13:35
iNils,
про цепочку области видимости переменной и постфиксное инкрементирование ты хорошо рассказал. Спасибо : )

Но удивительно другое.
// измененный вариант первой строчки твоего кода про _global
//
var x;
var y;
//
x = y++;
trace(x); // undefined (!)

// Как это должно работать:
// Переменная y имеет значение undefined.
// При использовании в числовом контексте (см. оператор инкрементирования)
// значение автоматически приводится к числовому типу данных - нулю (0);
//
// Результатом присваивания переменной x должен быть 0: постфиксный оператор инкрементирования
// возвращает значение операнда. Но это не так. Не так. Не так. Успокойся, Ватсёрнейм.

Whatsername
14.04.2006, 13:42
var x;
var y;
//
x = y++;
Этот код (опустив особенность постфиксного инкрементирования) можно переписать так:
var x;
var y;
//
x = y = y + 1;
trace(x); // 1 Как и ожидалось
Это очевидно. Но иллюстрирует загадку выше.

iNils
14.04.2006, 14:08
Все же просто
var x;
var y;
trace ("x=");
trace(x)
trace ("y=");
trace (y);
trace ("-------")
//
x = y++;
trace ("x=");
trace(x)
trace ("y=");
trace (y);
у до присвоения есть undefined, это значение мы и передаем x, а потом уж y увеличиваем на 1.
Но это для 6-го флеша, версии выше в результате дадут NaN для y.

Whatsername
14.04.2006, 18:52
iNils, выпить бы с тобой водки!
Инструкция постфиксного инкрементирования сперва возвращает значения операнда, а потом его инкрементирует. Я всегда знал как это работает, но это не помешало мне запутаться. Спасибо. Спасибо. :yahoo:

Поведение седьмого и восьмого плееров мне не понятно. Но так как я (пока еще) не занимался AS2, это вполне последовательно. :)

UPD:
Подозреваю, что автоматическое приведение типов данных в седьмом Флэше работает иначе.

manas
14.04.2006, 21:32
по-ходу я понял всё же в чем дело!!!!

вместо _global.glob++;я сделал ++_global.glob;
ЗАРАБОТАЛО!!!! Ура!!!
Спасибо iNils!

iNils
14.04.2006, 23:13
ничего ты не понял:)
разницы между:
_global.glob = 5;
_global.glob++;
trace (_global.glob); //6и
_global.glob = 5;
++_global.glob;
trace (_global.glob); //6Нет!
А здесь есть:
_global.glob = 5;
i = _global.glob++;
trace (i);//5
_global.glob = 5;
i = ++_global.glob;
trace (i);//6

manas
15.04.2006, 10:52
:)
дело в том, что
_global.glob = 5;
_global.glob++;
trace (_global.glob); //6
у меня вообще почему-то не срабатывал:confused: уж не знаю почему...
и "trace" постоянно выдавал исходное значение
вот...