![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Jul 2013
Сообщений: 9
|
Как известно, в AS3 использовать DuplicateMovieClip нельзя. Но иногда очень хочется.
Я перерыл массу материала, но ничего работающего я так и не нашел. Метод через конструктор создает пустой клип. Если копировать graphics, то не входят вложенные клипы. А при применении loadBytes от лоадера, код начинает выполняться бесконечно.( Можно попробовать запустить предложенный код (тупо в кадр, в библиотеке любой клип с экспортным именем zzzZ)) Неужели просто тупо растиражировать созданный программно невозможно? Или я что-то упустил? 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; |
|
|||||
|
Упустили, можно
Вы, как я понял, в IDE работаете? Если так, то следует просто указать файл, хранящий класс вашего собственного мувика (Картинка - первая по запросу в гугле "Flash IDE custom movieclip class"): ![]() Только в данном случае базовым классом будет не mx.flashUIMovieClip, а flash.display.MovieClip (это поле вообще заполняется автоматически) А потом в коде, в любом месте, делайте Имя класса, понятное дело, может быть любым. Главное потом не менять название файла .as И вложенные мувики не забудьте объявить в самом классе Последний раз редактировалось KumoKairo; 05.07.2013 в 21:01. |
|
|||||
|
c 11.6 версии FlashPlayer, копировать MovieClip можно так
__________________
местонахождение |
|
|||||
|
Регистрация: Jul 2013
Сообщений: 9
|
Первый ответ не подходит. Да, из библиотеки можно добавить любое количество экземпляров, но если необходимо сделать копии именно с генерируемого контента? Как добавить его в библиотеку? Или, например, как добавить в библиотеку файл, загруженный с диска?
По поводу второго совета совсем ничего не понял. Пробую cs6, там максимальная версия FlashPlayer 11.2 . Нашел совет, как добавить новые версии, но playerglobal.swc вроде как версии 4.6 , а она самая новая. И плюс к этому отличный вопрос, а раскадровка со скриптами тоже скопируется, или только графика? Потому что для графики можно б не париться и растеризовать... Последний раз редактировалось Mareg; 08.07.2013 в 16:35. Причина: Дополнение |
|
|||||
|
Насколько сильно отличаются сгенерированные объекты от того, что можно описать в классе?
Какая вообще задача решается? Если вы просто привыкли к способу копирования мувиков в AS2 то рано или поздно отвыкать все равно придется. Последний раз редактировалось KumoKairo; 08.07.2013 в 17:58. |
|
|||||
|
Регистрация: Jul 2013
Сообщений: 9
|
Представим гипотетическую ситуацию. На одном мувклипе сидит скрипт, которым пользователь рисует на поверхности (может еще и клип наложить сверху), а затем нам надо все видимое пространство 1000х1000 залить этим, отредактированным мувклипом, 100х100. Это так, разминка для мозга.
На самом деле ситуация такая. Есть огромное поле, которое надо заполнить тайлами (которые могут повторяться), причем тайлы должны грузиться с диска, и могут быть не только битмэповыми, но и swf файлами. Грузить их каждый раз, чтоб вставить нереально, а копировать не выходит. Если есть какая возможность запихнуть их в библиотеку - замечательно. Сделать из них класс - отлично. Вот только класс должен подгружаться динамически и как класс. И я давно перешел уже AS3 концепцию, но вот именно этот момент вообще неудобен. Вообще идеальным был бы вариант var a=b; при этом бэ становится независимым от а, но не ссылкой на него. то есть хотелось бы, например, добавить чайлда b но при этом а остался бы неизмененным, без чайлда. И, может не в тему, еще вопрос, как программно добавить кадр в клип. |
|
|||||
|
Регистрация: Feb 2010
Адрес: Город суеты
Сообщений: 191
|
Самый правильный вариант в данном случае - скопировать загруженную SWF в BitmapData, выгрузить swf, и плодить сколько угодно копий Bitmap
__________________
FlashPress.ru | Blog |
|
|||||
|
Lorem ipsum
|
Можно и вовсе грузить байты SWF-ки URLLoader-ом и потом скармливать эти данные методу loadBytes() каждого нового Loader-а. Это если уж совсем-совсем не хочется делать по-людски.
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Jul 2013
Сообщений: 9
|
Так, в итоге заработал вариант с лоадером. Вот ведь интересная хрень, все уперлось в многопоточность флэша, точнее в асинхронность. В итоге сначала создается массив лоадеров, потом он грузит картинки. Следующим пунктом коллбэк события комплит, где считается все ли лоадеры закончили. И ТОЛЬКО после этого можно копировать лоадеры, в временные лоадеры для добавления на сцену, причем свойства новых лоадеров применяются только после события комплит, и соответственно доступ к длине, ширине, и прочим вещам ведется через базовый массив. Вот код:
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); }; } 2)делаем папку с картинками 3) ... 4) PROFIT!!! Всем спасибо. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:07. |
|
|
« Предыдущая тема | Следующая тема » |
|
|