Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.11.2013, 13:39
mishasniper вне форума Посмотреть профиль Отправить личное сообщение для mishasniper Найти все сообщения от mishasniper
  № 1  
Ответить с цитированием
mishasniper

Регистрация: Nov 2013
Сообщений: 4
Question Отрисовать MovieClip c вложенными MC через BitmapData.draw

Доброго времени суток,

Подскажите , кто знает !

Вопрос :
Как отрисовать кадр-N анимированного MovieClip'a , если на его тайм-лайне лежат вложенные анимированные MC со своим таймлайн ???

Проблема :
Приведенный ниже способ позволяет "отрисовывать" анимированный MC только если в нем (на тайм-лайне) либо нет вложенных MC.
либо если вложенные анимации являются типом Graphic не MovieClip. ( но в Graphic не сделать нормальные эффекты )
А если вложены MovieClip'ы, то не зависимо от вызова для основного movie.gotoAndStop(N) вложенные MC всегда находятся на кадре 1.


Код AS3:
// загрузили swf 
var movie:MovieClip = ...
 
// берем каждый кадр
for (var i:int = 0; i < movie.totalFrames; i++)
{
  movie.gotoAndStop(i + 1);
  rect = movie.getBounds(movie);
  ...
  // И рисуем в Кэш
  var frame:BitmapData = new BitmapData( rect.width, rect.height, true, 0x00000000);
  frame.draw(movie, matrix, null, null, null, true);
  ...
}

Спасибо !


PS
Перебирать всех "Детей" на этом кадре и вызывать для них gotoAndStop , нереально, так как у вложееныех MC свой тайм-лайн со своим кол-вом кадров.

Старый 12.11.2013, 13:57
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 2  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Подождать некоторое кол-во кадров и отрисовать?

Или всех детей перекидывать на новый кадр.
__________________
hauts.ru

Старый 12.11.2013, 14:07
mishasniper вне форума Посмотреть профиль Отправить личное сообщение для mishasniper Найти все сообщения от mishasniper
  № 3  
Ответить с цитированием
mishasniper

Регистрация: Nov 2013
Сообщений: 4
Проблема не в переходе на кадр ,
а в детях, которые не переходят на след кадр вместе с родителем.
На кадре 1 проблем нет, но уже на кадре 2 , вложенные MC всё ещё на кадре 1. Точнее BitmapData.draw отрисовывает только их первый кадр.

Старый 13.11.2013, 09:20
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 4  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
mishasniper, я понимаю, про что вы.

Перекидывайте детей на нужный кадр и всё.
__________________
hauts.ru

Старый 13.11.2013, 11:33
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 5  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
PS
Перебирать всех "Детей" на этом кадре и вызывать для них gotoAndStop , нереально, так как у вложееныех MC свой тайм-лайн со своим кол-вом кадров.
А если написать функцию, которая пробегает по всем детям в данном кадре, и если находит мувиклип, то что-то в этом духе:
Код AS3:
if(child is MovieClip)
{
   if(child.currentFrame==child.totalFrames) child.gotoAndStop(1);
   else child.nextFrame()
}

Старый 13.11.2013, 16:53
mishasniper вне форума Посмотреть профиль Отправить личное сообщение для mishasniper Найти все сообщения от mishasniper
  № 6  
Ответить с цитированием
mishasniper

Регистрация: Nov 2013
Сообщений: 4
Всем cпасибо !

Мысль ясна,

решение похоже только одно :
вручную "двигать" детей на след кадр.


PS
Вот код , если кому пригодиться для решения подобной задачи.

Код AS3:
 
private var _frames:Vector.<BitmapData>;		
 
private function cacheMc( movie:MovieClip ):void
{
  for (var i:int = 0; i < movie.totalFrames; i++)
  {
    addFrame(movie);
    goToNextFrame(movie);
  }
}
 
private function addFrame(movie:MovieClip):void
{
    var bmd:BitmapData = createBitmap(movie);
 
    _frames.push(bitmap); // или Ваша реализация хранения BitmapData
}
 
static private function goToNextFrame(mc:MovieClip):void
{
  if(mc.currentFrame == mc.totalFrames)
    mc.gotoAndStop(1);
  else
    mc.nextFrame();
 
  for (var i:int = 0; i < mc.numChildren; i++)
  {
    var child:DisplayObject = mc.getChildAt(i);
    if(child is MovieClip)
      goToNextFrame(child as MovieClip);
  }
}
 
static private function createBitmap(movie:MovieClip):BitmapData
{
  var matrix:Matrix = new Matrix();        
  var rect:Rectangle = movie.getBounds(movie);
  matrix.rotate(movie.rotation * DEG_TO_RAD);
  matrix.scale(movie.scaleX, movie.scaleY);
  matrix.tx = -rect.left;
  matrix.ty = -rect.top;
 
  var frame:BitmapData = new BitmapData(rect.width , rect.height, true, 0x00000000);			
  frame.draw(movie, matrix, null, null, null, true);			
 
  return frame;
}

Старый 13.11.2013, 18:19
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 7  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Я бы только с округлением еще сделал бы: Math.floor(rect.left) и для размеров битмапы — в большую сторону.
__________________
hauts.ru

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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