ГлавнаяActionScript 3 — «100 советов» › Копирование динамической графики с помощью класса Proxy

Копирование динамической графики с помощью класса Proxy

June 19th, 2006
В 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), а вторая копия воспроизведена автоматически.

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

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

Метод callProperty класса Proxy TextField.appendText()
  1. Darkrain
    April 13th, 2010 at 18:04 | #1

    у меня не рисует… Выдает такую вот ошибку:
    1061: Обращение к возможно неопределенному методу beginFill через ссылку статического типа sw:GraphicsCopy.

  1. Пока нету.