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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.10.2006, 12:58
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 1  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 66. Аналог duplicateMovieClip

В 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, т.к. не может продублировать что-то динамически нарисованное, только объекты, имеющие свой класс.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

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

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

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


 


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


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