ГлавнаяActionScript 3 — «100 советов» › Аналог duplicateMovieClip

Аналог duplicateMovieClip

June 19th, 2006
В ActionScript 3 больше нет метода duplicateMovieClip, но его можно частично воспроизвести. Например, такая функция:

Код:
package com.senocular.display { import flash.display.DisplayObject; import flash.geom.Rectangle; /** * duplicateDisplayObject * Создает дубликат DisplayObject, * аналогично методу duplicateMovieClip из AVM1 * @param target Дублируемый объект * @param autoAdd Если true, то созданный дубликат будет добавлен * на сцену туда же, где и оригинал * @return возвращает ссылку на дубликат */ public function duplicateDisplayObject(target:DisplayObject, autoAdd:Boolean = false):DisplayObject { // Создаем дубликат (constructor в кавычках, чтобы компилятор не ругался в strict mode) var targetClass:Class = target["constructor"]; var duplicate:DisplayObject = new targetClass(); // Дублируем свойства duplicate.transform = target.transform; duplicate.filters = target.filters; duplicate.cacheAsBitmap = target.cacheAsBitmap; duplicate.opaqueBackground = target.opaqueBackground; if (target.scale9Grid) { var rect:Rectangle = target.scale9Grid; // Баг, Flash 9 возвращает scale9Grid в 20 раз больше чем на самом деле rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20; duplicate.scale9Grid = rect; } // Добавить дубликат к target.parent // если autoAdd установлен в true if (autoAdd && target.parent) { target.parent.addChild(duplicate); } return duplicate; } }

Как видите, все довольно просто, создается новый объект из того же класса, что и оригинал и дублируются свойства: transform, фильтры, кэширование и т.п.
Замечание: на данный момент во Flash Player 9 есть баг, некорректно возвращается свойство scale9Grid, эта функция исправляет ошибку, но когда баг в плеере исправят, строчку:

Код:
rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20;

нужно будет удалить.
Пример использования функции:

Код:
import com.senocular.display.duplicateDisplayObject; // Создаем дубликат мувиклипа myOldSprite // автоматически добавляя его на экран (autoAdd=true) var newInstance: DisplayObject = duplicateDisplayObject(myOldSprite, true); newInstance.x += 100; // сдвинуть правее, чтобы увидеть дубликат

Учтите, эта функция не является полным аналогом duplicateMovieClip, т.к. не может продублировать что-то динамически нарисованное, только объекты, имеющие свой класс.

Категория: ActionScript 3 — «100 советов» Ярлыки: ,

Смотрите также

Константы Метод callProperty класса Proxy
  1. danko-13
    April 1st, 2010 at 22:06 | #1

    Прикольно! А как узнать instanceName созданного мувика?

  2. April 8th, 2010 at 11:05 | #2

    danko-13 :
    А как узнать instanceName созданного мувика?

    Ну надо полагать используя свойство name экранного объекта DisplayObject

    var newInstance: DisplayObject = duplicateDisplayObject(myOldSprite, true);
    newInstance.name = “the_name”;

    trace(“And the name is:”+newInstance.name)

  1. Пока нету.