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