Flash / ActionScript: Dibuje un objeto de visualización "sobre" otro

¿Cómo dibujo correctamente un objeto vectorial en una posición específica de otro en ActionScript, teniendo en cuenta el posicionamiento, la transparencia, etc.?

Mi idea (como se sugiere, por ejemplo,aqu) era usarbeginBitmapFill () ydrawRect () para dibujar una copia de mapa de bits (realizada conBitmapData.draw ()) de un MovieClip en el.graphics propiedad del otro MovieClip, pero esto resultó más difícil de lo que pensaba, principalmente por estos motivos:

Transparency no se conserva: donde el MovieClip de origen es transparente, los gráficos de destino se vuelven blancos. He intentado usar unaBlendMode, pero no ayuda. Parece que los píxeles blancos se copian realmente en BitmapData. Debo estar perdiendo algo, pero no sé qué. Parece que el problema era que la documentación para elBitmapDatal constructor @ está mal: la transparencia no está predeterminada enciert, sinofals. Entonces, si creas unanew BitmapData(x, y, true) la transparencia se conserva, de lo contrario no.

Posicionamiento. Si el MovieClip de origen está centrado (con el centro en (0, 0), debe aplicar una Matriz para moverlo al copiarlo en un BitmapData, o el mapa de bits solo contendrá la parte inferior derecha del MovieClip de origen. Averigua cómo moverlo es complicado, y supongo que implica obtener los límites de alguna manera (si el objeto fuente está perfectamente centrado dentro de su lienzo, simplemente puede compensarlo a la mitad de su ancho y alto, por supuesto).

beginBitmapFill mosaico. Parece que si no comienzas ladrawRect () en (0, 0), el relleno de mapa de bits tampoco comienza desde (0, 0) dentro del mapa de bits. Esto significa que debe cambiar el mapa de bits de origen una vez más, en función de dónde desea comenzar a dibujar.

(Luego hay otras cosas como tener que lineStyle (0,0,0) para que drawRect () no dibuje un borde, etc.)

Todos estos problemas difíciles me llevan a creer que voy por esto de la manera incorrecta. ¿Hay una manera más fácil de hacer esto? ¿Hay alguna biblioteca en algún lugar que pueda ayudarme? ¿Alguien ha hecho esto con éxito? ¿Quizás mi lienzo de dibujo no debería ser un Sprite sino un Bitmap? Pero entonces no sé cómo dibujar usandolineTo () etc.

Aquí está la situación: Tengo un Sprite al que dibujo usando su .graphics, usando lineTo () etc. Ahora quiero usar un MovieClip como pincel al dibujar (o simplemente colocar una copia de otro MovieClip en la superficie de dibujo), haciendo que Otra parte de MovieClip de los gráficos de la primera. No puedoaddChild () porque entonces los gráficos vectoriales no interactuarían con los gráficos dibujados.

EDITA: Theo ha proporcionado una solución de trabajo que funciona perfectamenteexcept por el hecho de que no aplica la rotación y escalado aplicado al objeto DisplayObject que se dibuja en la superficie de gráficos. Esto es La solución de Theo:

private function drawOntoGraphics(source : IBitmapDrawable, target : Graphics, position : Point = null) : void
{
    position = position == null ? new Point() : position;
    var bounds : Rectangle = DisplayObject(source).getBounds(DisplayObject(source));
    var bitmapData : BitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00000000);
    bitmapData.draw(source, new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y), null, null, null, true);
    target.beginBitmapFill(bitmapData, new Matrix(1, 0, 0, 1, bounds.x + position.x, bounds.y + position.y));
    target.drawRect(bounds.x + position.x, bounds.y + position.y, bounds.width, bounds.height);
}

Para admitir la rotación y el escalado, supongo que se debe modificar lo siguiente:

LosMatrix utilizado endraw() debe copiar la escala y la rotación de la fuenteDisplayObject?LosMatrix utilizado enbeginBitmapFill() ¿también debería copiar esta escala y rotación? ¿O tal vez eso crearía una escala y rotación "doble"?LosdrawRect()as coordenadas @ deben modificarse para que coincidan con el tamaño de las @ escaladas y giradDisplayObject? Lo que significagetBounds() no será exacto?

EDITA: Aquí hay una implementación funcional que admite el escalado y la rotación, realizada a partir de todos los comentarios:

static function DrawOntoGraphics(source:MovieClip, target:Graphics, 
        position:Point = null):void {
    var sourceClass:Class = getDefinitionByName(getQualifiedClassName(source)) 
        as Class;   
    var sourceCopy:MovieClip = new sourceClass();
    sourceCopy.rotation = source.rotation;
    sourceCopy.scaleX = source.scaleX;
    sourceCopy.scaleY = source.scaleY;
    sourceCopy.graphics.clear();
    var placeholder:MovieClip = new MovieClip();
    placeholder.addChild(sourceCopy);
    if (!position) 
        position = new Point();
    var bounds:Rectangle = placeholder.getBounds(placeholder);
    var bitmapData:BitmapData = new BitmapData(bounds.width, bounds.height, 
        true, 0x00000000);
    var drawMatrix:Matrix = new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y);
    bitmapData.draw(placeholder, drawMatrix);           
    placeholder.removeChild(sourceCopy);
    var fillMatrix:Matrix = new Matrix(1, 0, 0, 1, bounds.x + position.x, 
        bounds.y + position.y);
    target.beginBitmapFill(bitmapData, fillMatrix);
    target.lineStyle(0, 0x00000000, 0);
    target.drawRect(bounds.x + position.x, bounds.y + position.y, 
        bounds.width, bounds.height);
    target.endFill();
}

Algo relacionado pero no tan candente pregunta: ¿Cómo poner una imagen (por ejemplo, PNG) en un gráfico en Flex 3?

Respuestas a la pregunta(3)

Su respuesta a la pregunta