Показать сообщение отдельно
Старый 24.10.2006, 13:42
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 62  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

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

В ActionScript 3 нет возможности непосредственно скопировать графику созданную в Graphics. Но можно использовать класс Proxy для записи всех вызванных методов, чтобы потом их воспроизвести при копировании. Например, такой вариант:
Код:
package com.senocular.display {
    
    import flash.display.Graphics;
    import flash.utils.flash_proxy;
    import flash.utils.Proxy;
    
    /**
     * Класс для расширения graphics с возможностью создания копии рисунка
     */
    public class GraphicsCopy extends Proxy {
        
        private var _graphics:Graphics;
        private var history:Array = new Array();
        
        /**
         * Ссылка на graphics
         */
        public function get graphics():Graphics {
            return _graphics;
        }
        public function set graphics(g:Graphics):void {
            _graphics = g;
            
            // Создаем копию рисунка на новом Graphics
            copy(this);
        }
        
        /**
         * Конструктор
         * @param graphics Ссылка на Graphics рисование по которому  запоминаем
         */
        public function GraphicsCopy(graphics:Graphics = null) {
            _graphics = graphics;
        }
        
        /**
         * Копирует сюда рисунок из другого класса GraphicsCopy
         */
        public function copy(graphicsCopy:GraphicsCopy):void {
            var hist:Array = graphicsCopy.history;
            history = hist.slice();
            if (_graphics) {
                var i:int;
                var n:int = hist.length;
                _graphics.clear();
                for (i=0; i<n; i += 2) {
                    _graphics[hist[i]].apply(_graphics, hist[i + 1]);
                }
            }
        }
        
        // Перехват вызова несуществующего метода, с помощью этого
        // метода PROXY и реализована запись процесса рисования.
        override flash_proxy function callProperty(methodName:*, ... args):* {
            methodName = String(methodName);
            switch(methodName) {
                case "clear":
                    history.length = 0;
                    break;
                default:
                    history.push(methodName, args);
            }
            if (_graphics && methodName in _graphics) {
                return _graphics[methodName].apply(_graphics, args);
            }
        }
    }
}
Теперь достаточно при рисовании вместо свойства graphics использовать экземпляр класса GraphicsCopy, который запоминает историю вызванных при рисовании методов и может ее воспроизвести, при создании копии.
Пример:
Код:
// MyClass.as Класс наследник от Shape с использованием GraphicsCopy
package {
    
    import flash.display.Shape;
    import com.senocular.display.GraphicsCopy;
    
    class MyShape extends Shape {
        
        // свойство graphicsCopy
        private var _graphicsCopy:GraphicsCopy;
        public function get graphicsCopy():GraphicsCopy {
            return _graphicsCopy;
        }
        
        // Конструктор
        function MyShape(){
            _graphicsCopy = new GraphicsCopy(graphics);
        }
    }
}
Код:
// Пример использования 
// Что-то рисуем на shape 1
var shape1:MyShape = new MyShape();
shape1.graphicsCopy.beginFill(0xFF80);
shape1.graphicsCopy.lineStyle(2, 0);
shape1.graphicsCopy.drawRect(0, 0, 50, 50);

// Делаем копию рисунка на  shape2
var shape2:MyShape = new MyShape();
shape2.graphicsCopy.copy(shape1.graphicsCopy);

// Добавляем на экран
addChild(shape1);
addChild(shape2);
shape2.x += 100;
В результате вы увидите два зеленых квадрата, первый нарисован нами (метод drawRect), а вторая копия воспроизведена автоматически.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.