在没有填充的情况下将精灵绘制到bitmapData上

时间:2016-07-28 17:41:13

标签: actionscript-3 haxe openfl

我有一个精灵,它是一个旋转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);

然而结果让我感到惊讶: 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,但更奇怪的是,无论矩形有多大,对象都不会被复制(只留下黑色空间)。我忘了{{1 }}和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进行测试

谢谢。

1 个答案:

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

结果:

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错误。