Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как сделать копию мувиклипа (http://www.flasher.ru/forum/showthread.php?t=132811)

yzhastik 20.11.2009 18:27

как сделать копию мувиклипа
 
Здравствуйте!

Я загружаю swf-ки и засовываю их в массив, этот массив играет роль библиотеки мувиков. То есть мне нужно произвольное количество раз копировать мувик из этого самого массива.
А передачи значения во флеше на сколько я знаю нет... Как выйти из такого положения?

Заранее спасибо!

ramshteks 20.11.2009 18:35

окакой передаче данных вы говорите?
а насчет копирования есть такой метод getDefenitionByName

dimarik 20.11.2009 18:52

Код AS3:

ApplicationDomain#getDefinition(name:String);


yzhastik 20.11.2009 20:03

ну передача в функцию по ссылке\значению, имелось ввиду то, что во flash нет передачи по значению, а есть только по ссылке

чтото я плохо понял про getDefenitionByName и то, как он может мне пригодится... я ведь говорю о копировании мувиков (просто мувиков без кода внутри)

Felicast 20.11.2009 22:48

реализуйте свой метод копирования
Код AS3:

someFunc(yourClip.clone());


yzhastik 21.11.2009 09:38

тогда как его реализовать, можно пример пожалуйсто?
сам я не догадаюсь просто, как можно скопировать мувик...

bicubic_bublic 21.11.2009 11:48

если каждой свфке задать свой уникальный класс, то
Код AS3:

var newSWF:MovieClip = (new (loadedSWF as Object).constructor) as MovieClip;


SamFR 21.11.2009 13:23

Тогда уж легче задать в этой swf-ке произвольное кол-во классов, и получать их экземпляры с помощью
Код AS3:

var InstClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('имя_класса') as Class;
var inst:* = null;
if(InstClass){
        inst = new InstClass();
}else trace('Cannot resolve class');

Добавлено через 12 минут
Цитата:

Сообщение от yzhastik (Сообщение 867247)
тогда как его реализовать, можно пример пожалуйсто?
сам я не догадаюсь просто, как можно скопировать мувик...

Да, кстати, yzhastik, если вам нужно много раз получить один и тот же мувик, то вам этот метод как раз подойдёт.

Здесь loader – это экземпляр Loader, которым вы грузили swf-библиотеку. Также, если вы знаете базовый класс, то экземпляр лучше типизировать. Пусть, например, мы знаем, что мы храним в либе мувики либо спрайты (т.е. наследники DisplayObject). Тогда лучше будет написать

Код AS3:

var InstClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('имя_класса') as Class;
var inst:DisplayObject = null;
if(InstClass){
        inst = new InstClass() as DisplayObject;
}else trace('Cannot resolve class');

Тогда в случае, если объявление такого класса содержится в библиотеке, и он действительно имеет в качестве базового класса класс DisplayObject, то в переменной inst у вас окажется нужный вам экземпляр. В противном случае inst будет равна null.

Метод же clone() раелизовывать нужно тогда, когда требуется скопировать объект вместе с его состоянием, то есть учитывая изменения, произошедшие в нём с момента создания.

yzhastik 21.11.2009 17:06

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

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

ramshteks 21.11.2009 17:30

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

SamFR 21.11.2009 21:06

вряд ли...
хотя кто его знает)

а вообще, зачем выгружать библиотеку, если её планируется использовать? :)

yzhastik 21.11.2009 23:35

хмм... неужели никто с подобным не сталкивался? когда нужно разместить произвольное количество независимых копий одной и той же swf-ки?

bicubic_bublic 21.11.2009 23:52

Цитата:

Сообщение от yzhastik (Сообщение 867390)
хмм... неужели никто с подобным не сталкивался? когда нужно разместить произвольное количество независимых копий одной и той же swf-ки?

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

SamFR 22.11.2009 00:29

Цитата:

Сообщение от yzhastik (Сообщение 867326)
метод не подходит только изза того, что мувики я загружаю последовательно, и в лоадере останется инфа только о последнем...

Ну а кто вам мешает грузить их параллельно? Или это дело принципа? :)

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

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

yzhastik 22.11.2009 11:50

Цитата:

Сообщение от bicubic_bublic (Сообщение 867391)
вам уже ответили несколько вариантов.
чем вас не устраивает этот?
к тому же вам никто не мешает для каждой загружаемой свфки использовать свой собственный лоадер..

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

dimarik 23.11.2009 10:17

unload не влияет на содержимое applicationDomain. Как говорится, слово класс не воробей: засветился - не вырубишь и unload'ом.

SamFR 23.11.2009 15:59

Цитата:

Сообщение от dimarik (Сообщение 867604)
unload не влияет на содержимое applicationDomain.

Оп, а вот это интересно) Т.е., если после loader.unload() я обращусь к loader.contentLoaderInfo.applicationDomain.getDefinition(...), то получу то же, что и до unload-а?
А что будет в случае загрузки нового содержимого в тот же лоадер? И как тогда избавиться от уже не используемых классов?

dimarik 23.11.2009 18:27

Definitions [of application domain]. The definition can be that of a class, a namespace, or a function.

Небольшие исследования показали, что при живой ссылке на application domain не происходит выгрузка definitions, даже если вы сделали
loader.unload() и убили сам loader. Но стоит зарезать последнюю ссылку на аппдомен, то он тут же будет съеден GC при очередной чистке. А без ссылки на аппдомен никак не получить definition, т.е. это бессмыслено. Если грузить в ApplicationDomain.currentDomain, то definitions, по понятным причинам, живут до кончины приложения.

SamFR 23.11.2009 22:57

Понятно, спасибо за полезную информацию)

dimarik 23.11.2009 23:25

Цитата:

Сообщение от SamFR (Сообщение 867781)
Понятно, спасибо за полезную информацию)

Это еще не все. Я буду Капитаном Очевидность, но подтвеж(у(ду?)хехе), что ничего нового нельзя загрузить в существующий Application domain, помимо того, что там уже есть. Flash Player просто не даст Вам это сделать. Я про конфликтующие имена классов, неймспейсов, функций... короче, definitions, которые уже существуют там.

SamFR 23.11.2009 23:55

Вложений: 1
Цитата:

Сообщение от dimarik (Сообщение 867790)
... ничего нового нельзя загрузить в существующий Application domain, помимо того, что там уже есть ...

Это, ктсати, совсем не очевидно. И похоже, что даже не так. Если, конечно, я вас правильно понял :)
Во вложении совсем немного модифицированный для наглядности пример из адобовского хелпа, демонстрирующий обратное.

да, у меня с этим словом тоже всегда проблемы =)

dimarik 24.11.2009 00:08

Чорд. Ну не купил (и не крякнул... пока.. тока тссс...!) я себе CS4. Конвертер посоветуйте =)
А код оформлен супер!

SamFR 24.11.2009 00:18

Вложений: 1
Цитата:

Сообщение от dimarik (Сообщение 867807)
Чорд. Ну не купил (и не крякнул... пока.. тока тссс...!) я себе CS4.

И правильно. Ничего в нём такого нет, только тормозов больше :)
Если флеш не врёт, что может сохранять в формате CS3, то это должно заработать)

dimarik 24.11.2009 00:39

Code review:
Зачем Вам каждый раз создавать инстансы типа ClassLoader?

По переопределению. Я же сказал, что конфликтный класс обламывается, и пролетает как фанера над Парижем.
В Вашем коде _тожесамое_ =)

З.Ы. Экстендз Sprite - это банально =)
Даёшь реальный дефинишн!!

SamFR 24.11.2009 01:37

Эт не я их создаю. Это господа из Abobe, так что все жалобы к ним :)
Цитата:

Сообщение от dimarik (Сообщение 867815)
По переопределению. Я же сказал, что конфликтный класс обламывается, и пролетает как фанера над Парижем.
В Вашем коде _тожесамое_ =)

А, ну значит, я всё же неправльно понял) Я просто подумал, речь шла о том, что такие действия приведут к рантайм-ошибке.

Цитата:

Сообщение от dimarik (Сообщение 867815)
З.Ы. Экстендз Sprite - это банально =)
Даёшь реальный дефинишн!!

Зато дёшево, сердито и реалистично :)

Mur4ik 24.11.2009 12:35

Цитата:

Сообщение от dimarik (Сообщение 867815)
З.Ы. Экстендз Sprite - это банально =)
Даёшь реальный дефинишн!!

Это уже не в моде?

dimarik 01.12.2009 22:18

http://martinfowler.com/articles/injection.html

Добавлено через 21 минуту
up по-моему =)
есть мысль, что пока существует объект, созданный из дефинишина аппдомена, и этот объект имеет ссылку на loaderInfo.applicationDomain, то аппдомен здравствует и существует благодаря такому объекту.


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

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