Форум 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)
-   -   swapDepths() Баг или я что-то непонимаю? (http://www.flasher.ru/forum/showthread.php?t=94993)

chingachgoog 25.04.2007 14:30

swapDepths() Баг или я что-то непонимаю?
 
Вложений: 1
Столкнулся с крайне непонятной ситуацией.
(см. вложение)

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

Код в мувике:
Код:

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

Цитата:

Сообщение от __etc
При возврате на первый фрейм флеш видит там мувик

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

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

motor4ik 25.04.2007 15:26

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

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

etc 25.04.2007 15:29

Цитата:

Сообщение от chingachgoog
Забавно.
Если заменить swapDepth на startDrag например

startDrag глубину не изменяет.

Kikasso 25.04.2007 15:29

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

chingachgoog 25.04.2007 15:36

Цитата:

Сообщение от motor4ik
убивать нужно не тот мувик а этот новый созданный )
...
вобщем нужно убивать мувик который вы делаете swapDepths при возврате на тот кадр на котором он уже есть

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

motor4ik 25.04.2007 15:36

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

chingachgoog 25.04.2007 15:38

Цитата:

Сообщение от motor4ik
и не надо хранить данные в мувике!

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

etc 25.04.2007 15:38

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

motor4ik 25.04.2007 15:40

Цитата:

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

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

etc 25.04.2007 15:40

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

motor4ik 25.04.2007 15:42

Цитата:

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

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

Цитата:

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

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

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
Пока решилось так:
Код:

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

Это хит!
Цитата:

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

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

chingachgoog 25.04.2007 16:42

Цитата:

Сообщение от Kikasso
Об этом можно не беспокоится - все, что нарисовано, имеет отрицательную глубину.

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

MyXus 25.04.2007 16:43

об этом можно не беспокоиться

motor4ik 25.04.2007 16:56

Цитата:

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

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

chingachgoog 25.04.2007 19:01

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

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

Цитата:

Сообщение от __etc
Я же предложил решение.

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


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

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