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

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

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

Регистрация: Jul 2013
Сообщений: 9
Post Попытки все-таки скопировать MoveClip с помощью AS3

Как известно, в AS3 использовать DuplicateMovieClip нельзя. Но иногда очень хочется.

Я перерыл массу материала, но ничего работающего я так и не нашел. Метод через конструктор создает пустой клип. Если копировать graphics, то не входят вложенные клипы.
А при применении loadBytes от лоадера, код начинает выполняться бесконечно.( Можно попробовать запустить предложенный код (тупо в кадр, в библиотеке любой клип с экспортным именем zzzZ))

Неужели просто тупо растиражировать созданный программно невозможно? Или я что-то упустил?


Код AS3:
import flash.display.MovieClip;
import flash.display.Loader;
import flash.events.Event;
 
var mc:MovieClip=new MovieClip();
 
mc.graphics.beginFill(0xff00ff);
mc.graphics.drawCircle(0,0,10);
 
addChild(mc);
 
var a=addChild(mc);
a.x=100;a.y=100;
a.addChild(new zzzZ());
 
var b:MovieClip=new MovieClip();
 
b=dupDi(a);
addChild(b).x=10;
 
 
 
 
var ldr:Loader=new Loader();
trace(1);
ldr.addEventListener(Event.COMPLETE, ldrloaded);
ldr.loadBytes(mc.loaderInfo.bytes);
trace(2);
 
function ldrloaded(e:Event)
{
	trace(1);
	trace(e.currentTarget.loaderInfo.bytes);
}
 
 
function dupDi(target:MovieClip):MovieClip 
{
 
	var targetClass:Class = target["constructor"];
	var duplicate:MovieClip = new targetClass();
 
	duplicate.transform = target.transform;
	duplicate.filters = target.filters;
	duplicate.cacheAsBitmap = target.cacheAsBitmap;
	duplicate.opaqueBackground = target.opaqueBackground;
	//duplicate.graphics.copyFrom(target.graphics);
	duplicate.graphics.beginFill(0x111111);
	duplicate.graphics.drawCircle(0,0,1);
	return duplicate;
}
 
 
//addChild(b).y=50;

Старый 05.07.2013, 20:50
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 2  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Упустили, можно
Вы, как я понял, в IDE работаете?
Если так, то следует просто указать файл, хранящий класс вашего собственного мувика
(Картинка - первая по запросу в гугле "Flash IDE custom movieclip class"):

Только в данном случае базовым классом будет не mx.flashUIMovieClip, а flash.display.MovieClip (это поле вообще заполняется автоматически)

А потом в коде, в любом месте, делайте
Код AS3:
var myLittleRedBox:RedBox = new RedBox();
Имя класса, понятное дело, может быть любым. Главное потом не менять название файла .as

И вложенные мувики не забудьте объявить в самом классе


Последний раз редактировалось KumoKairo; 05.07.2013 в 21:01.
Старый 05.07.2013, 20:56
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 3  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
c 11.6 версии FlashPlayer, копировать MovieClip можно так
__________________
местонахождение

Старый 08.07.2013, 16:30
Mareg вне форума Посмотреть профиль Отправить личное сообщение для Mareg Найти все сообщения от Mareg
  № 4  
Ответить с цитированием
Mareg

Регистрация: Jul 2013
Сообщений: 9
Первый ответ не подходит. Да, из библиотеки можно добавить любое количество экземпляров, но если необходимо сделать копии именно с генерируемого контента? Как добавить его в библиотеку? Или, например, как добавить в библиотеку файл, загруженный с диска?

По поводу второго совета совсем ничего не понял. Пробую cs6, там максимальная версия FlashPlayer 11.2 . Нашел совет, как добавить новые версии, но playerglobal.swc вроде как версии 4.6 , а она самая новая. И плюс к этому отличный вопрос, а раскадровка со скриптами тоже скопируется, или только графика? Потому что для графики можно б не париться и растеризовать...


Последний раз редактировалось Mareg; 08.07.2013 в 16:35. Причина: Дополнение
Старый 08.07.2013, 17:11
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 5  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Насколько сильно отличаются сгенерированные объекты от того, что можно описать в классе?
Какая вообще задача решается?

Если вы просто привыкли к способу копирования мувиков в AS2 то рано или поздно отвыкать все равно придется.


Последний раз редактировалось KumoKairo; 08.07.2013 в 17:58.
Старый 08.07.2013, 19:24
Mareg вне форума Посмотреть профиль Отправить личное сообщение для Mareg Найти все сообщения от Mareg
  № 6  
Ответить с цитированием
Mareg

Регистрация: Jul 2013
Сообщений: 9
Представим гипотетическую ситуацию. На одном мувклипе сидит скрипт, которым пользователь рисует на поверхности (может еще и клип наложить сверху), а затем нам надо все видимое пространство 1000х1000 залить этим, отредактированным мувклипом, 100х100. Это так, разминка для мозга.

На самом деле ситуация такая. Есть огромное поле, которое надо заполнить тайлами (которые могут повторяться), причем тайлы должны грузиться с диска, и могут быть не только битмэповыми, но и swf файлами. Грузить их каждый раз, чтоб вставить нереально, а копировать не выходит. Если есть какая возможность запихнуть их в библиотеку - замечательно. Сделать из них класс - отлично. Вот только класс должен подгружаться динамически и как класс.

И я давно перешел уже AS3 концепцию, но вот именно этот момент вообще неудобен.

Вообще идеальным был бы вариант var a=b;
при этом бэ становится независимым от а, но не ссылкой на него.

то есть хотелось бы, например, добавить чайлда b но при этом а остался бы неизмененным, без чайлда.

И, может не в тему, еще вопрос, как программно добавить кадр в клип.

Старый 08.07.2013, 20:46
maincode вне форума Посмотреть профиль Отправить личное сообщение для maincode Посетить домашнюю страницу maincode Найти все сообщения от maincode
  № 7  
Ответить с цитированием
maincode

Регистрация: Feb 2010
Адрес: Город суеты
Сообщений: 191
Самый правильный вариант в данном случае - скопировать загруженную SWF в BitmapData, выгрузить swf, и плодить сколько угодно копий Bitmap
__________________
FlashPress.ru | Blog

Старый 08.07.2013, 21:00
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 8  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Можно и вовсе грузить байты SWF-ки URLLoader-ом и потом скармливать эти данные методу loadBytes() каждого нового Loader-а. Это если уж совсем-совсем не хочется делать по-людски.
__________________
Поймай яблоко 2!

Старый 08.07.2013, 21:37
Mareg вне форума Посмотреть профиль Отправить личное сообщение для Mareg Найти все сообщения от Mareg
  № 9  
Ответить с цитированием
Mareg

Регистрация: Jul 2013
Сообщений: 9
Так, в итоге заработал вариант с лоадером. Вот ведь интересная хрень, все уперлось в многопоточность флэша, точнее в асинхронность. В итоге сначала создается массив лоадеров, потом он грузит картинки. Следующим пунктом коллбэк события комплит, где считается все ли лоадеры закончили. И ТОЛЬКО после этого можно копировать лоадеры, в временные лоадеры для добавления на сцену, причем свойства новых лоадеров применяются только после события комплит, и соответственно доступ к длине, ширине, и прочим вещам ведется через базовый массив. Вот код:

Код AS3:
 
var he;
var wi;
var flp:Array;
var pole1;
var count;
var countMax;
 
 
function form(pole:Array,poole:Array)
{
	trace(0);
	flp=new Array();
	count=1;
	pole1=pole;
	countMax=18;
 
	for(var i=1;i<=countMax;i++)
	{
		 flp[i]= new Loader();
		 var urlReq:URLRequest = new URLRequest("imgs/"+i+".png");
		 flp[i].load(urlReq);
		 flp[i].contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
	}
 
	trace(1);
}
 
 
//paint(pole);
 
 
function paint(pole:Array)
{
	//trace(1);
	//trace(flp.length);
	var k:MovieClip=new MovieClip;
	for (var i = 0; i < 8; i++)
	{
	 for (var j = 0; j < 8; j++)
		{
 
			var ldr:Loader=new Loader();
 
			ldr.loadBytes( Loader(flp[pole[i][j]]).content.loaderInfo.bytes );
 
			var a=k.addChild(ldr);
 
			he=flp[pole[i][j]].content.height/2;//a.height/2; 
			wi=flp[pole[i][j]].content.width/2;//a.width/2;
 
			a.x=j*(-wi)+i*wi /*- wi*0.5*/;
			a.y=j*he+i*he;
 
			trace(a.x,a.y);
		}
	}
	addChild(k);
 
 
}
 
function loaded(e)
{
	//trace(count);
	if(++count>=countMax) 
	{
		paint(pole1);
	};
}
1) Кидаем в кадр
2)делаем папку с картинками
3) ...
4) PROFIT!!!



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

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

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

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


 


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


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