Преобразование Sprite в растровые данные с другой точкой регистрации и поворотом - PullRequest
0 голосов
/ 23 мая 2011

Я пытаюсь преобразовать имеющийся у меня Sprite в BitmapData, чтобы я мог выполнить некоторое обнаружение столкновений. В использовании Спрайтов есть несколько моментов, которые делают это более трудным, чем я ожидал:

  • Сам спрайт - это контейнер, в котором находится другой спрайт, на котором нарисована коробка. Внутренний спрайт расположен в отрицательной половине его ширины и высоты, так что его можно поворачивать из центра через контейнер.
  • Контейнер может вращаться под любым углом в любое время

Таким образом, мой подход до сих пор был попыткой нарисовать внешний Sprite на новый объект BitmapData с матрицей, чтобы учесть разницу. Хотя я могу использовать Матрицу, чтобы заставить эту работу работать для одного конкретного угла поворота, я не могу найти способ заставить ее работать для любого вращения.

Вот что я делаю, чтобы нарисовать новые BitmapData:

var p:Product = getProduct(); // Product is the container with the inner sprite
var bounds:Rectangle = p.getBounds(stage);
var bd:BitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00FFFFFF);

var m:Matrix = p.transform.matrix;
// Somewhere here is what needs to be changed, I can't figure out how though
m.tx = 0;
m.ty = 0;

bd.draw(p, m);

С m.tx = 0 & m.ty = 0, вот пример того, что я получаю и чего я хочу получить:

screencap, not rotated

Желтое изображение справа - это фактическое поле, а черный контур - это «контейнер», который поворачивается. Изображение слева - это то, что я получаю для BitmapData, где я хочу, чтобы желтое поле не было обрезано. В этом примере я мог бы просто перевести tx и ty на половину ширины и высоты, что сработало бы.

Лучшим примером будет, когда он действительно повернут: screencap, rotated

Перевод на ту же сумму, что и в предыдущем примере, больше не будет работать, и поле все равно будет обрезано. Я осмотрел некоторые решения, опубликованные ранее, или предложения других людей, но они, похоже, не работают для меня из-за моего контейнера Sprite и ротации.

Я бы очень признателен за любую помощь по этому вопросу.

Спасибо!

1 Ответ

2 голосов
/ 23 мая 2011

попробуйте заменить

m.tx = 0;
m.ty = 0

на

m.tx = -bounds.x;
m.ty = -bounds.y;
...