2016-07-28 5 views
2

Ich habe ein Sprite, das ein primitives Rechteck ist, das um 45 Grad gedreht ist. Ich würde gerne eine Bitmap mit BitmapData erstellen, die es genau kopieren wird. Ich dachte, dass BitmapData#draw nur auf meinem Sprit arbeitet, also versuchte ich naiven Ansatz:Sprite auf BitmapData ohne Padding zeichnen

var a = new Sprite(); 
a.graphics.beginFill(0xFF0000); 
a.graphics.drawRect(0, 0, 200, 100); 
a.graphics.endFill(); 
a.x = 100; 
a.y = 100; 
a.rotation = 45; 

addChild(a); 

var bitmapData = new openfl.display.BitmapData(1500, 1500, false, 0x00000000); 
bitmapData.draw(a); 

var bitmap = new openfl.display.Bitmap(bitmapData); 
bitmap.x = 500; 
bitmap.y = 100; 
addChild(bitmap); 

aber das Ergebnis hat mich überrascht: Weird padding

Es scheint, es Transformations-Matrix bewahrt (die in der Tat Sinn macht, sonst Rotation wäre verloren). Also habe ich versuchte robusten Ansatz:

var bitmapData = new openfl.display.BitmapData(1500, 1500, false, 0x00000000); 

var rect = a.getBounds(a.parent); 
var matrix = a.transform.concatenatedMatrix; 
matrix.translate(-rect.left, -rect.top); 
bitmapData.draw(a, matrix); 

gewünschtes Ergebnis ist

Und noch, die gleiche Resultat wie im Bild zur Verfügung gestellt. Ich habe versucht clipRect param, aber noch seltsamer, egal wie groß das Rechteck ist, Objekt überhaupt nicht kopiert wird (nur schwarzer Raum bleibt). Ich vergaß x und y, ist Clip kein Problem

var bitmapData = new openfl.display.BitmapData(1500, 1500, false, 0x00000000); 
var clip = new openfl.geom.Rectangle(1500, 1500); 
bitmapData.draw(a, clip); 

I BitmapData#draw mißbrauchen Bin? Jede Hilfe willkommen

(Es muss BitmapData- sein, wie ich es in pixelgenaue Kollisionsprüfung zu verwenden, haben mit BitmapData#hitTest)

OpenFL 4.0.0
Getestet mit Cpp, Neko und HTML5

Thank Sie.

+0

Ich bin nicht sicher, was Ihre Frage genau ist, weil ich nicht sicher bin, was Ihr gewünschtes Ergebnis ist. – null

+0

Bild mit gewünschtem Ergebnis hinzugefügt. Aber ich denke, der Code ist richtig, aber es könnte [ein Fehler in OpenFL 4] sein (https://github.com/openfl/openfl/issues/1214) – Misiur

Antwort

2

Mit Flash das richtige Ergebnis sollte ein festes Rechteck oben links neben dem Bitmap-Bereich, wie dies:

var sp:Sprite = new Sprite(); 
     sp.graphics.beginFill(0xff0000, 1); 
     sp.graphics.drawRect(0, 0, 100, 50); 
     sp.graphics.endFill(); 
     sp.x = 100; 
     sp.y = 100; 
     sp.rotation = 45; 
     addChild(sp); 
     var bd:BitmapData = new BitmapData(400, 400, false, 0); 
     bd.draw(sp); 
     var bm:Bitmap = new Bitmap(bd); 
     bm.x = 200; 
     bm.y = 0; 
     addChild(bm); 

Ergebnis:

drawn bitmap

Also wirklich, überprüfen Sie die OpenFL-Verhalten, wenn standardmäßig die Transformationsmatrix des übergebenen Ziels verwendet wird, dann OK, aber bei Flash ist das Standardverhalten, nur die übergebene Matrix zu verwenden, wenn es eine gibt.

EDIT: Auch Getestet mit Ihrem Code:

var rect = sp.getBounds(sp.parent); 
var matrix = sp.transform.concatenatedMatrix; 
matrix.translate(-rect.left, -rect.top); 
bd.draw(sp, matrix); 

Das Ergebnis entspricht Ihr gewünschtes Ergebnis. Also ja, das sollte ein OpenFL Bug sein.

Verwandte Themen