Flash/ActionScript: Zeichnen Sie ein Objekt anzeigen "auf" andere

Wie kann ich richtig zeichnen einer Vektor-Objekt auf eine bestimmte position des anderen in ActionScript, Buchhaltung für die Positionierung, Transparenz, etc?

Meine Idee (wie vorgeschlagen z.B. hier) zu nutzen, um die beginBitmapFill() und drawRect() zum zeichnen einer bitmap kopieren (mit BitmapData.draw()) von einem MovieClip auf der .graphics Eigentum der anderen MovieClip, doch dies erwies sich als schwieriger, als ich dachte, vor allem aus diesen Gründen:

  1. Transparenz nicht beibehalten: wo die Quell-MovieClip transparent ist, wird der Ziel-Grafik wird weiß. Ich habe versucht, mit einer BlendMode, aber es hilft nicht. Es scheint weiße Pixel sind tatsächlich kopiert in das BitmapData. Ich muss etwas fehlen, aber ich weiß nicht, was. Es scheint, das problem war, dass die Unterlagen für die BitmapData Konstruktor ist falsch: Transparenz standardmäßig nicht wahr, aber false. Also, wenn Sie erstellen ein new BitmapData(x, y, true) Transparenz bleibt erhalten, sonst nicht.

  2. Positionierung. Wenn die Quell-MovieClip zentriert ist (mit dem Mittelpunkt (0, 0), müssen Sie eine Matrix, um es zu verschieben, wenn das kopieren auf ein BitmapData-oder bitmap enthält nur unten rechts in der Quell-MovieClip. Herauszufinden, wie viel zu bewegen, ist es schwierig, und ich nehme an, es beteiligten immer die Grenzen irgendwie. (Wenn das source-Objekt ist perfekt zentriert innerhalb seiner Leinwand, Sie können einfach kompensiert werden, indem die Hälfte seiner Breite und Höhe, natürlich.)

  3. beginBitmapFill Fliesen. Es scheint, wenn Sie nicht starten Sie die drawRect () (0, 0), die bitmap-Füllung nicht starten von (0, 0) innerhalb der bitmap entweder. Dies bedeutet, dass Sie eine Verschiebung der Quell-bitmap wieder, basierend auf, wo Sie wollen zu zeichnen beginnen.

(Dann gibt ' s andere Sachen, wie dass lineStyle(0,0,0), so dass die drawRect() nicht in einen Rahmen zeichnen etc.)

All diese kniffligen Probleme führt mich zu glauben, ich werde über dies der falsche Weg. Gibt es ein einfacher Weg, dies zu tun? Gibt es eine Bibliothek irgendwo, die mir helfen kann? Hat jemand erfolgreich getan? Vielleicht ist meine Zeichnung Leinwand sollte kein Sprite, sondern ein Bitmap? Aber dann weiß ich nicht, wie zu zeichnen, um es mit lineTo() etc.

Hier ist die situation: ich habe eine Sprite, die ich zum zeichnen benutzen sein .Grafiken, mit lineTo (), etc. Jetzt will ich mit einem MovieClip als Pinsel beim zeichnen (oder legen Sie einfach eine Kopie von einem anderen MovieClip auf der Zeichenfläche), so dass die anderen MovieClip Teil der Grafik auf den ersten ein. Ich kann nicht addChild() weil dann die Vektor-Grafik würde nicht die Interaktion mit den Grafiken erstellt.


BEARBEITEN: Theo hat eine funktionierende Lösung, die perfekt funktioniert außer für die Tatsache, dass es nicht gilt die rotation und Skalierung angewendet, um die DisplayObject-gezogen wird auf die Grafik-Oberfläche. Dies ist Theo ' s Lösung:

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);
}

Unterstützen, rotation und Skalierung, ich nehme an, das Folgendes geändert werden:

  1. Die Matrix verwendet in draw() kopieren sollten Sie die Skalierung und die rotation aus der Quelle DisplayObject?
  2. Die Matrix verwendet in beginBitmapFill() kopieren sollten diese Skalierung und rotation wie auch? Oder vielleicht schaffen würde, die "doppelte" rotation und Skalierung?
  3. Die drawRect() Koordinaten geändert werden sollte, um die Größe des skalierten und gedrehten DisplayObject? Was bedeutet getBounds() wird nicht genau sein?

BEARBEITEN: Hier ist eine funktionierende Implementierung, die unterstützt die Skalierung und rotation, von allen das feedback:

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();
}

Etwas verwandt, aber doch nicht so heiß Frage: Wie man ein Bild (z.B. PNG) auf eine Grafik, die in Flex 3?

InformationsquelleAutor bzlm | 2009-02-16
Schreibe einen Kommentar