我有一个精灵,它是一个旋转45度的原始矩形。我想使用Bitmap
创建一个BitmapData
,它会完全复制它。我认为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);
然而结果让我感到惊讶:
它似乎保留了变换矩阵(实际上这是有意义的,否则旋转会丢失)。所以我尝试了更强大的方法:
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);
期望的结果是
然而,结果与提供的图像相同。 我尝试了我忘了{{1 }}和clipRect
param,但更奇怪的是,无论矩形有多大,对象都不会被复制(只留下黑色空间)。x
,剪辑不是问题
y
我是否误用var bitmapData = new openfl.display.BitmapData(1500, 1500, false, 0x00000000);
var clip = new openfl.geom.Rectangle(1500, 1500);
bitmapData.draw(a, clip);
?任何帮助表示赞赏
(必须是BitmapData,因为我必须使用BitmapData#draw
在像素完美的碰撞测试中使用它)
OpenFL 4.0.0
使用Cpp,Neko和HTML5进行测试
谢谢。
答案 0 :(得分:2)
使用Flash,正确的结果应该是位图区域左上角的实心矩形,如下所示:
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);
结果:
实际上,检查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错误。