Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   не могу клонировать объект 3мя разными способами (http://www.flasher.ru/forum/showthread.php?t=185398)

Psijic 11.10.2012 19:34

не могу клонировать объект 3мя разными способами
 
Пробую клонировать Sprite/MovieClip 3мя разными способами, ни один не срабатывает. Хотя в трейсе пишут, объект есть - ничего не отображается.

Код AS3:

        public function clone(object:Object):*
        {
                var byteArray:ByteArray = new ByteArray();
                byteArray.writeObject(object);
                byteArray.position = 0;
                return byteArray.readObject();
        }
 
var clone1:Sprite = clone(target);
addChildAt(clone1, numChildren);

тут уже тупо в кадре пишу по f9
Код AS3:

var target:DisplayObject = Symbol1;
var targetClass:Class = (target as Object).constructor;
var duplicate:DisplayObject = new targetClass();
addChild(duplicate);
duplicate.x = 20;
duplicate.y = 20;
trace("duplicate =",duplicate, duplicate.x, duplicate.y);
Symbol1.x = 200;
trace(getQualifiedClassName(duplicate));

Код AS3:

registerClassAlias("lolo", (targetClass));
var ClassReference:Class = getClassByAlias("lolo");
var activeTab:MovieClip = new ClassReference();
addChild(activeTab);
trace("activeTab =", activeTab);

Среды - flash pro cs 5.5, flashDevelop
Может быть, надо каким-то хитрым образом в классе прописать addChild?

Добавлено через 9 минут
трейсы 2, 3 кусков кода

Код:

duplicate = [object MovieClip] 20 20
flash.display::MovieClip
activeTab = [object MovieClip]


gloomyBrain 11.10.2012 19:51

Для того, чтобы создать несколько MovieClip с графикой, нарисованной во Flash CSx, нужно этому MovieClip прописать класс в библиотеке и создавать экземпляры этого класса. Иного способа нет.

dimarik 12.10.2012 00:43

Я предполагаю, что графику Shape, Sprite с любым графическим содержимым (authority и runtime) невозможно скопировать вышеназванными способами. Для копирования authority-sprites, не помеченных для экспортирования, подойдет разбор swf-тегов с последующим созданием виртуального SWF-файла и загрузкой через Loader#loadBytes(); Для содержимого, отрисованного в рантайме через super.graphics даже представления не имею.

maxkar 12.10.2012 01:03

Цитата:

Для содержимого, отрисованного в рантайме через super.graphics даже представления не имею.
Это можно сделать через Graphics.copyFrom. Но это будет только содержимое Graphics и никаких детей видно не будет. Вероятно, для authority-time graphics это тоже сработает, но только при определенных условиях (не используются дочерние символы, например).

Isfet 12.10.2012 05:49

Код AS3:

public function clone(object:Object):*
        {
                var byteArray:ByteArray = new ByteArray();
                byteArray.writeObject(object);
                byteArray.position = 0;
                return byteArray.readObject();
        }

давно уже задавался таким вопросом, и находил эту функцию, но как выяснилось она подходит только для простых объектов.
Решения тогда было отрисовывать все спрайты с помощью graphics и копированием ее же во вновь созданный спрайт с помощью метода Graphics.copyFrom. Если объекты сложные (несколько вложений) ,то проще не заморачиваться с копированием, а создавать новый экземпляр.

dimarik 12.10.2012 10:11

Цитата:

Если объекты сложные (несколько вложений) ,то проще не заморачиваться с копированием, а создавать новый экземпляр.
А как быть, если полноценный экземпляр вы не можете создать? Смотрите: у вас на руках есть ссылка на экземпляр, предположим, что это простой наследник Shape, связанный с authority графикой. Класс этого экземпляра не помечен на экспорт. Ваши действия?

Psijic 12.10.2012 12:23

Цитата:

Сообщение от gloomyBrain (Сообщение 1099526)
Для того, чтобы создать несколько MovieClip с графикой, нарисованной во Flash CSx, нужно этому MovieClip прописать класс в библиотеке и создавать экземпляры этого класса. Иного способа нет.

все это, конечно, очень клево, да вот только объект берется через 2 загрузчика swf

Кстати, во флексе есть ObjectUtil - там есть и clone и copy. Нельзя ли как-то это подключить во flash?

Добавлено через 2 часа 1 минуту
А если регистрировать класс, поможет? Что-то не могу подобрать что вставлять в getClassByAlias, registerClassAlias

Код AS3:

                var buffer:ByteArray = new ByteArray();
                var newClass:Class = getClassByAlias(String(value));
 
                registerClassAlias(String(newClass), value.constructor);
                buffer.writeObject(value);
                buffer.position = 0;
                return buffer.readObject();


gloomyBrain 12.10.2012 16:06

Цитата:

Сообщение от Psijic (Сообщение 1099597)
все это, конечно, очень клево, да вот только объект берется через 2 загрузчика swf

ну это как раз не очень страшно. Если с crossdomain.xml все в порядке, то никто не мешает вытащить ссылку на класс и создать его экземпляр:
Код AS3:

var MyClass:Class = loader.applicationDomain.getDefinition("className") as Class;

Могут быть проблемы с получением ссылки на сам loader, но это немного другая песня.

Psijic 12.10.2012 17:01

Цитата:

Сообщение от gloomyBrain (Сообщение 1099629)
ну это как раз не очень страшно. Если с crossdomain.xml все в порядке, то никто не мешает вытащить ссылку на класс и создать его экземпляр:

какое-то извращение грузить ресурс по 2 раза. Лучше уж сделать отдачу переменной через return и какой-нибудь геттер или паблик или dispatchEvent

gloomyBrain 12.10.2012 18:14

Где вы увидели "грузить"? Я предлагаю из уже загруженной swf-ки получить ссылку на класс.


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

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