2016-07-28 4 views
2

У меня есть спрайт, который является примитивным прямоугольником, повернутым на 45 градусов. Я хотел бы создать Bitmap, используя BitmapData, который скопирует его точно. Я думал, что BitmapData#draw будет работать только на моем спрайта, поэтому я попытался наивный подход:Рисование спрайта на bitmapData без заполнения

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, но еще более странно, независимо от того, насколько большой прямоугольник, объект вообще не копируется (осталось только черное пространство). я забыл о 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#draw? Любая помощь приветствуется

(Должно быть BitmapData, как я должен использовать его в пиксельной идеальный тестирования столкновения с использованием BitmapData#hitTest)

OpenFL 4.0.0
Испытано с CPP, Неко и HTML5

Спасибо вы.

+0

Я не уверен, каков ваш вопрос, потому что я не уверен, каков ваш желаемый результат. – null

+0

Добавлено изображение с желаемым результатом. Однако я думаю, что код прав, но может быть [ошибка в OpenFL 4] (https://github.com/openfl/openfl/issues/1214) – Misiur

ответ

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, если по умолчанию используется матрица преобразования пройденного объекта, затем ОК, но для Flash поведение по умолчанию - это использовать только переданную матрицу, если она есть.

EDIT: Испытано с кодом тоже:

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

Результат соответствует вашему желаемому результату. Так что да, это должна быть ошибка OpenFL.

Смежные вопросы