2016-07-28 10 views
2

私は45度回転したプリミティブ矩形であるスプライトを持っています。私はそれを正確にコピーするBitmapDataを使用してBitmapを作成したいと思います。私はBitmapData#drawは私のスプライト上で動作することを考えたので、私は単純なアプローチを試してみました:埋め込みなしでビットマップデータにスプライトを描画

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

結果は私を驚かしかし: Weird padding

そうでなければ、実際には理にかなっている(それは変換行列を維持すると思われます回転が失われる)。だから私は、より堅牢なアプローチを試してみました:

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

所望の結果が

そして、提供された画像のように、まだ、同じ結果です。 私はclipRect paramを試しましたが、矩形がどれほど大きくても、オブジェクトはまったくコピーされません(黒いスペースだけが残っています)。私は約xy、クリップが問題

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

ではありません、私はBitmapData#drawを悪用アム忘れましたか?すべてのヘルプは

を高く評価し

OpenFL 4.0.0
CPP、猫とHTML5

でテスト

感謝(私はBitmapData#hitTestを使用してピクセルの完璧な衝突テストでそれを使用するために持っているとしてそれは、のBitmapDataでなければなりません)君は。 Flashで

+0

私はあなたの望む結果が何であるかわからないので、あなたの質問が正確であるか分かりません。 – null

+0

画像に希望の結果が追加されました。しかし、コードは正しいと思うが、[OpenFL 4にバグがあるかもしれない](https://github.com/openfl/openfl/issues/1214) – Misiur

答えて

2

、適切な結果は次のように、ビットマップ領域の左上にある固体の長方形でなければなりません:

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

結果:

drawn bitmap

だから、本当に、チェックOpenFLの動作、渡されたターゲットの変換行列を使用するのがデフォルトの場合はOK、Flashの場合はデフォルトの動作は渡された行列がある場合にのみ使用します。

編集:あまりにもあなたのコードでテスト:

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

結果は、ご希望の結果と一致しました。そう、はい、これはOpenFLのバグでなければなりません。

関連する問題