Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: проблема со вложенными мувиками в MovieClip
Flash Zone Forum > Macromedia Flash > ActionScript
darkchaos
Добрый день, уважаемое сообщество.

Столкнулся с такой проблемой: у меня есть MovieClip, в котором лежат другие мувики с анимацией. Для каждого из кадров главного мувика я делаю BitmapData, затем перехожу на следующий кадр, чтобы в скриншоте была анимация, я делаю переход всем внутренним мувикам на следующий кадр. Но в результате я не получаю анимации, а получаю первый статический кадр, хотя трейсы показывают, что создаются все кадры. Можно как-то решить эту проблему без использования таймера или же enter_frame?
chingachgoog
Цитата(darkchaos @ 17.03.2010 - 21:45) *
Для каждого из кадров главного мувика я делаю BitmapData, затем перехожу на следующий кадр, чтобы в скриншоте была анимация


Это как это? В скриншоте АНИМАЦИЯ? ЧТо-то я не понял.
darkchaos
Цитата(chingachgoog @ 18.03.2010 - 09:29) *
Это как это? В скриншоте АНИМАЦИЯ? ЧТо-то я не понял.


Есть мувик mcParent, в нем лежат мувики mcStatic (внутри нету анимации) и mcDynamic (анимация из нескольких кадров). Делаю:

for (var i:int = mcParent.currentFrame; i < mcParent.totalFrames; i++) {
mcParent.gotoAndStop(i);
var iTotalChildren:int = mc.numChildren;
for(j = 0; j < iTotalChildren; j++) {
jumpNextFrame(mcParent.getChildAt(j), i);
}
var bmd:BitmapData = new BitmapData(100, 100, true, 0);
bmd.draw(mcParent);
}

private final function jumpNextFrame(doObject:DisplayObject, frame:int):void {
var mc:MovieClip = doObject as MovieClip;
if (mc) {
var children:int = mc.numChildren;
for(var i:int = 0; i < children; i++) {
jumpNextFrame(mc.getChildAt(i), frame);
}
mc.gotoAndStop(frame% mc.totalFrames);
trace(mc.name, mc.numChildren, "current frame",mc.currentFrame);
}
}

И после этого кода я вижу только первый кадр мувика mcParent, хотя трейс показывает что создано столько кадров, сколько в анимации. mcParent имеет столько же кадров как и mcDynamic
chingachgoog
Во-первых вижу как в битмапдату скриншотиться mcParent, но не вижу где битмапдата добавляется в дисплей-лист?
Во-вторых, по-моему вы хотите невозможного: вы хотите создать свой таймлайн - т.е. фреймы (кадры) с содеримым.
darkchaos
Цитата(chingachgoog @ 18.03.2010 - 11:53) *
Во-первых вижу как в битмапдату скриншотиться mcParent, но не вижу где битмапдата добавляется в дисплей-лист?
Во-вторых, по-моему вы хотите невозможного: вы хотите создать свой таймлайн - т.е. фреймы (кадры) с содеримым.


1) Есть один мувиклип, в который на каждый enter_frame делается copyPixels нужного фрейма, но это происходит в другом месте и не имеет к данному вопросу отношения
2) Да я фактически и создаю свой таймлайн, но почему это невозможноsmile.gif Такой метод мне необходим для визуального прироста производительности (т.к. много сложного вектора на сцене получится), памяти конечно больше уходит, но это уже вопрос оптимизации
chingachgoog
Вы не можете создать объект ТОЛЬКО в отдельном кадре таймлайна. Кадры таймлайна создаются ТОЛЬКО во флеш-редакторе. По-моему так.
Поэтому когда вы создаете визуальный объект, то он присутствует НА ВСЕХ КАДРАХ своего визуального родителя, а не на том, где сейчас воспроизводящая головка. Вернее, в начале-то он только на том, но после того как головка перешла к другому кадру, ваш объект НЕ ИСЧЕЗАЕТ (как исчез бы объект вручную посаженный в кадр во флеш-редакторе).
darkchaos
Цитата(chingachgoog @ 18.03.2010 - 12:19) *
Вы не можете создать объект ТОЛЬКО в отдельном кадре таймлайна. Кадры таймлайна создаются ТОЛЬКО во флеш-редакторе. По-моему так.
Поэтому когда вы создаете визуальный объект, то он присутствует НА ВСЕХ КАДРАХ своего визуального родителя, а не на том, где сейчас воспроизводящая головка. Вернее, в начале-то он только на том, но после того как головка перешла к другому кадру, ваш объект НЕ ИСЧЕЗАЕТ (как исчез бы объект вручную посаженный в кадр во флеш-редакторе).


Мы наверное говорим немного о разных вещах)) Роль таймлайна у меня выполняет вектор, в зависимости от счетчика кадра я выдаю определенный элемент из коллекции. Мувик, с которого я пытаюсь сделать скриншот сделан во флеш редакторе, а получаю я его по class name. Я точно знаю, что элемент во время снятия скриншота у меня точно существует, трейсы показывают что я нахожусь на правильном кадре у внутреннего мувика и у внешнего тоже, но визуальная картинка не меняется

С похожей проблемой сталкивался после того как делал переход gotoAndStop и сразу обращался к детям по instance name, выдавало null, приходилось ждать события enter_frame, думаю что здесь похожая проблема, но код переписывать не хотелось, думал что есть другие способы решения этой проблемы
chingachgoog
Если я правильно понял, то у вас битмапа копируется (скриншотит) правильно и с нужных кадров, но проблема в том, что это копирование происходит В ОДИН И ТОТ ЖЕ КАДР. Этот кадр вы и видите (картинку последней снятой битмапы). Попробуйте копировать пиксел с прозрачностью в 10% и увидите, что выйдет (т.к. метод draw не перерисовывает, а добавляет, накладывает).
darkchaos
Цитата(chingachgoog @ 18.03.2010 - 12:38) *
Если я правильно понял, то у вас битмапа копируется (скриншотит) правильно и с нужных кадров, но проблема в том, что это копирование происходит В ОДИН И ТОТ ЖЕ КАДР. Этот кадр вы и видите (картинку последней снятой битмапы). Попробуйте копировать пиксел с прозрачностью в 10% и увидите, что выйдет (т.к. метод draw не перерисовывает, а добавляет, накладывает).


Да я знаю что этот метод так работает. Только я писал кусок кода, который делает скриншоты, а не добавляет их на сценуsmile.gif Отрисовка происходит в другом месте с помощью метода copyPixels. В этом месте формируется только вектор с набором изображений (кадров). Я описал проблему, потому что в конкретном клипе у меня есть вложенные мувики с анимацией, если их нету, то все работает без проблем
chingachgoog
copyPixels замените на цикл с getPixel -> setPixel32 (c прозрачностью 10%) Все увидите сами, раз уж не хотите давать кусок кода в котором у вас и есть проблема.
darkchaos
Цитата(chingachgoog @ 18.03.2010 - 13:37) *
copyPixels замените на цикл с getPixel -> setPixel32 (c прозрачностью 10%) Все увидите сами, раз уж не хотите давать кусок кода в котором у вас и есть проблема.


Спасибо, но это не решение проблемы. Я в начале описал в чем проблема и когда она возникает, без вложенной анимации работает безотказно. Проблема в копировании, код копирования я привел. Если интересно, то код для отрисовки вот: _bmd.copyPixels(bmd, bmd.rect, new Point(x, y), null, null, true); _bmd содержится в Bitmap, который лежит на сцене
chingachgoog
Это решение проблемы в том смысле, что решение проблемы начинается с осознания проблемы.
У вас ОДИН экранный объект Bitmap, как вы собираетесь в него запихнуть АНИМАЦИЮ (несколько скриншотов)?
darkchaos
Цитата(chingachgoog @ 18.03.2010 - 14:09) *
Это решение проблемы в том смысле, что решение проблемы начинается с осознания проблемы.

Полностью согласен, но сейчас мы немного друг друга не понимаем

Роль таймлайна у меня выполняет вектор, в зависимости от счетчика кадра я выдаю определенный элемент из коллекции. Мувик, с которого я пытаюсь сделать скриншот сделан во флеш редакторе, а получаю я его по class name. Я точно знаю, что элемент во время снятия скриншота у меня точно существует, трейсы показывают что я нахожусь на правильном кадре у внутреннего мувика и у внешнего тоже, но визуальная картинка не меняется, т.е. я беру конкретный элемент вектора и делаю ему copyPixels в единственную битмапу, на следующей итерации я беру следующий элемент из вектора и проделываю тоже самое, перед этим затираю все что было до этого. Получаю что я рисую битмапу как бы на чистом листе, в результате того, что я или не правильно копирую, или такое копирование невозможно сделать я получаю одну и ту же картинку, хотя по все логике вещей элементы в векторе должны быть скриншотами анимации, повторюсь это возникает, если только есть вложенная анимация, если вся анимация на одном таймлайне, то метод отрабатывает нормально
chingachgoog
Цитата(darkchaos @ 18.03.2010 - 15:27) *
беру конкретный элемент вектора и делаю ему copyPixels в единственную битмапу


И как вы хотите увидеть анимацию (скриншоты с нескольких кадров) в одной битмапе?

Цитата(darkchaos @ 18.03.2010 - 15:27) *
если вся анимация на одном таймлайне, то метод отрабатывает нормально


Что такое "анимация на одном таймлайне"? Это несколько фреймов с разными шейпами? И как в одной битмапе отображаются шейпы с разных фреймов?
darkchaos
Цитата(chingachgoog @ 18.03.2010 - 15:34) *
И как вы хотите увидеть анимацию (скриншоты с нескольких кадров) в одной битмапе?
Что такое "анимация на одном таймлайне"? Это несколько фреймов с разными шейпами? И как в одной битмапе отображаются шейпы с разных фреймов?


Я же говорю, что с каждым тиком таймера перерисовываю все битмапу, т.е. беру новый фрейм (новое состояние анимации) и русую его, потом повторяю это столько раз сколько элементов находится в Vector. Т.е. происходит как бы смена кадров, визуально никак не будет отличатся от мувиклипа, который был бы добавлен на сцену, только рендерится уже не векторное изображение, а растровое, тем самым разгружая процессор. Теперь понятно))

Анимация на одном таймлайне я подразумеваю что нет мувиклипов, которые содержат внутри себя анимацию
chingachgoog
Ага. Теперь примерно ясно. Битмап - это телевизор, на который вы время от времени проецируете скриншоты.
Попробуйте спроецировать (соскриншотить) какой-нибудь ОДИН кадр из анимации (второй или третий). Чтобы точно знать, что кадры кроме первого не могут скриншотиться.

Возможные проблемы:
1) Мувик с которого все скриншотиться не успел подгрузиться (решение: куинуть его в библиотеку с выставленным параметром экспорта в первый кадр)
2) Это особенность AS3
3) Анимация - это не объект класса MovieClip (???)
darkchaos
Все вопрос решился. Я у себя нашел ошибку в другом месте. Я так понял что ты просто не работал с таким способом рендеринга, поэтому не могли найти общего языка)), если будут вопросы, то пиши. Этот метод есть смысл применять, если используешь в играх и там много векторных изображений или анимации
chingachgoog
С каким "таким" способом? )))
Только из предпоследнего сообщения стало хоть чуть ясно, о чем идет речь. А из первого сообщения и выложенных кусков кода ничего не ясно. Да и ошибка, как и ожидалось, была не в этом коде.

Как говориться, в правильно поставленном вопросе уже есть ответ )))

Успехов!
MustLive
Цитата
Все вопрос решился. Я у себя нашел ошибку в другом месте.

darkchaos

Вот и хорошо, что сам решил проблему - от этого больше пользы будет. В дальнейшем всегда старайся более внимательно изучать проблему, т.к. иногда проблема с флешкой может заключаться совсем в другом, чем то, о чём ты на форуме спросил (как ты сам убедился на данном примере). А наш форум всегда поможет решить проблему - или подскажет решение, или создаст условия, чтобы ты сам смог её решить wink.gif.

Цитата
проблема со вложенными мувиками в MovieClip

"Вложенные мувики" и работа с BitmapData с целью создания своего виртуального таймлана - это разные вещи smile.gif. Так что, как заметил chingachgoog, в правильно поставленном вопросе уже имеется ответ. В результате продолжительной дискуссии вы пролили свет на то, о чём вообще идёт речь (в твоей флешке), но к этому времени и проблема решилась. Что безусловно хорошо.

Цитата
Такой метод мне необходим для визуального прироста производительности

Данный метод интересный - он будет полезен для оптимизации флешки, когда нужно повысить производительность (например, во флеш играх).
Русская версия IP.Board © 2001-2011 IPS, Inc.