PDA

Просмотр полной версии : swapDepths() Баг или я что-то непонимаю?


chingachgoog
25.04.2007, 14:30
Столкнулся с крайне непонятной ситуацией.
(см. вложение)

Есть мувиклип. Он меняет свою глубину программно. И все бы ничего, пока он расположен на родительской диаграмме состоящей из ОДНОГО кадра. Но когда она состоит из нескольких кадров происходят "чудеса": мувик начинает размножаться.

Код в мувике:

if (!Ainit){
_x=Math.random()*550
_y=Math.random()*400
Ainit=true
trace("INIT; name "+_name+" depth "+getDepth())
}

onPress=function(){
this._parent[_name].swapDepths(_parent.getNextHighestDepth())
trace("name "+_name+" depth "+getDepth())
}


На главной диаграмме состоящей из ДВУХ кадров расположены:
1 - этот мувик
2 - кнопки перехода по кадрам (соответственно две кнопки)

Баг проявляется если выполнить следующую последовательность:
1) сменить глубину (кликнуть по мувику)
2) перейти на следующий кадр (кликнуть по нижней кнопке)
3) вернуться на предыдущий кадр (кликнуть по верхней кнопке)
На этом месте появляется ВТОРОЙ мувик! С ним можно выполнить ту же последовательность действий с 1 по 3-й. А вот с его родителем уже ничего не выйдет.

etc
25.04.2007, 14:33
Убивать надо мувик перед переходом назад.

chingachgoog
25.04.2007, 14:38
А почему он копируется? Ведь если один кадр на главной диаграмме, то ничего не происходит.

Да и зачем убивать? Мне нужны данные сохраненные в этом мувике.

etc
25.04.2007, 14:43
При swapDepths мувик уже не привязан к таймлайну и сохраняется при переходах по фреймам. При возврате на первый фрейм флеш видит там мувик и отображает (а куда он денется?). А копия клипа, в силу независимости от таймлайна продолжает отображаться.

chingachgoog
25.04.2007, 15:19
При возврате на первый фрейм флеш видит там мувик


Забавно.
Если заменить swapDepth на startDrag например, то флеш возратясь на 1-й кадр почему-то не увидит там этот же клип в исходном положении.
И только для swapDepth делает такое "приятное исключение".
Не ясно почему он не убивает автоматом мувик на старой глубине? Ведь при одном кадре мувик перемещается (т.е. никаких исходников-прототипов мувика не сохраняется).

И как теперь с этим жить? :-)
Как убить мувик на старой глубине, если это должно и так делаться автоматом?

motor4ik
25.04.2007, 15:26
это не должно делаться автоматом если вы понимаете суть дела, т.к. клип созданный вручную и кодом это не совсем одно и тоже, так вот swapDepth делает копию вашего клипа. т.е. создает динамический клип, а тот собсвенно остается, и теперь на новый клип кадры никак не влияют , а на тот влияют, т.е. все логично, что тот появится при переходе назад )) убивать нужно не тот мувик а этот новый созданный )

нда, лектор из меня хреновый, понимаю что ничего не понятно что я написал ))
вобщем нужно убивать мувик который вы делаете swapDepths при возврате на тот кадр на котором он уже есть

etc
25.04.2007, 15:29
Забавно.
Если заменить swapDepth на startDrag например
startDrag глубину не изменяет.

Kikasso
25.04.2007, 15:29
Ну оставьте один кадр на таймлайне.
Или не перематывайте в тот кадр, где мувик появляется.

chingachgoog
25.04.2007, 15:36
убивать нужно не тот мувик а этот новый созданный )
...
вобщем нужно убивать мувик который вы делаете swapDepths при возврате на тот кадр на котором он уже есть

Не, начальный мувик мне не нужен, а вот в перемещаемом храниться нужная инфа, поэтому убивать его нельзя.
Вы правы, можно решить проблему ИЗНАЧАЛЬНО помещая мувик на таймлайн программно - тогда такого не будет. Но по ряду причин такой вариант маложелателен. Или надо делать какой-то хитрый финт, что мувик при старте ОДИН раз себя копирует (и копия живет счастливо и долго) и удаляется?

motor4ik
25.04.2007, 15:36
атачте его из библиотеки, в любом случае это лучше, раз вы всеровно меняете глубину, то уж лучше его подгрузить на нужную грубину из библиотеки.
и не надо хранить данные в мувике!

chingachgoog
25.04.2007, 15:38
и не надо хранить данные в мувике!

Почему?
Для моей конкретной задачи надо. Считайте этот мувик компонентом.

etc
25.04.2007, 15:38
Поставить проверку в первом кадре, если мувик на данной глубине существует, то вынести старый мувик на положительную глубину и убить. В противном случае просто swapDepths.

motor4ik
25.04.2007, 15:40
Почему?
Для моей конкретной задачи надо. Считайте этот мувик компонентом.

ну тогда тем более лучше подгружать его. так как другого способа я не вижу, потому что у вас дублирование имен и в любом случае действия нужно будет делать с тем мувиком который был дублирован в котором информация.

etc
25.04.2007, 15:40
Имя вынесенного мувика можно поменять.

motor4ik
25.04.2007, 15:42
Поставить проверку в первом кадре, если мувик на данной глубине существует, то вынести старый мувик на положительную глубину и убить. В противном случае просто swapDepths.

как узнать на какой он глубине? старый мувик? а по имени как к нему обратиться? к какому из мувиков он обратится? у них одинаковые имена будут, я думаю что обратится всетаки к тому что не динамически, ...эммм лучше подгрузить )))

Имя вынесенного мувика можно поменять.

ради чего такой геморой*?

etc
25.04.2007, 15:48
При первом запуске и выносе на новую глубину клип можно переименовать. При возврате на первый кадр старыйц клип со старым именем будет доступен, уж прибить его сложностей не составляет.

Если это геморрой, то имхо загрузка ещё бОльший геморрой.

chingachgoog
25.04.2007, 15:59
Пока решилось так:

if (!Ainit){
...
Ainit=true
UnicName="myUnic"
d_old=getDepth()
}

onPress=function(){
...
this._parent[_name].swapDepths(_parent.getNextHighestDepth())
onEnterFrame=function(){
myDel()
}

}

myDel=function(){
Del=_parent.getInstanceAtDepth(d_old)

if (Del!=undefined && Del.UnicName=="myUnic"){
Del.swapDepths(getNextHighestDepth())
Del.removeMovieClip()
this.swapDepths(getNextHighestDepth())
}
}


Не уверен, что onEnterFrame технично, может чем его заменить?
Также неясна вероятность того, что на данной глубине в ДРУГОМ кадре (не первом) может быть ДРУГОЙ объект.

etc
25.04.2007, 16:12
Я же предложил решение.

Kikasso
25.04.2007, 16:12
Пока решилось так:

тут была ошибка

Это хит!

Также неясна вероятность того, что на данной глубине в ДРУГОМ кадре (не первом) может быть ДРУГОЙ объект.
Об этом можно не беспокоится - все, что нарисовано, имеет отрицательную глубину.

chingachgoog
25.04.2007, 16:42
Об этом можно не беспокоится - все, что нарисовано, имеет отрицательную глубину.

У меня проверка по этой глубине в коде.
Может ли случиться, что разные объекты в разных фреймах имеют одну и ту же отрицательную глубину

MyXus
25.04.2007, 16:43
об этом можно не беспокоиться

motor4ik
25.04.2007, 16:56
У меня проверка по этой глубине в коде.
Может ли случиться, что разные объекты в разных фреймах имеют одну и ту же отрицательную глубину

не может случится а такое и есть, в каждом фрейме глубины одинаковые и если по одному разному объекту допустим для проверки положить в разные фреймы то они будут на одно глубине

chingachgoog
25.04.2007, 19:01
Для этого на всякий случай ввел дополнительную переменную UnicName="myUnic".
(см. код выше) Пока все пашет как надо :-) (тьфу-тьфу-тьфу)

Всем спасибо!

Я же предложил решение.

Да, пришлось примерно так и сделать, только реализовать код надо было строго внутри мувика.