BitmapData.draw clipRect не работает должным образом - PullRequest
3 голосов
/ 29 июня 2011

У меня есть компонент, который содержит 4 слоя: (в порядке возрастания глубины) bgImage: Sprite, dropZone: Sprite, dropMask: Sprite и line: Sprite.Значение bgImage равно 0,0, а остальные объекты размещаются в различных положительных координатах.dropMask маскирует dropZone.

В точке захвата растрового изображения я хочу рисовать только из слоев dropZone и dropMask, поэтому я пытаюсь это сделать:

removeChild(bgImage);
removeChild(line);
var bmd:BitmapData = new BitmapData(dropMask.width,dropMask.height,true,0);
bmd.draw(this,null,null,null,dropMask.getBounds(this));

Несмотря на то, что dropMask находится в 50,60захват всегда начинается с 0,0.Я также попытался получить границу прямоугольника и принудительно задать x, y, но это не имеет значения.Что я здесь не так делаю, и я должен просто забыть clipRect и использовать вместо этого матрицу?

Ответы [ 2 ]

6 голосов
/ 29 июня 2011

Обычная рутина для этого:

var rect:Rectangle = dropMask.getRect(dropMask.parent);
var matrix:Matrix = new Matrix();
matrix.translate(-rect.x, -rect.y);
var bmp:BitmapData = new BitmapData(rect.width, rect.height, false, 0xFFFF0000);
bmp.draw(dropMask.parent, matrix);

Шаги решения:

  1. получите rectangle в координатном пространстве того, что вы собираетесь нарисовать.
  2. получить единичную матрицу и перевести ее на -rectangle.x, -rectangle.y
  3. используйте эту матрицу в draw() вызове.

На шаге 1 вы можете даже столкнуться с чем-то вроде этого:

import flash.display.Sprite;

var test:Sprite = new Sprite();
test.graphics.beginFill(0, 1);
test.graphics.drawCircle(125, 234, 100);
test.graphics.endFill();

// we are going to draw test, so we get a rectangle 
// in its own coordinate space to deal with registration point offset
var rect:Rectangle = test.getRect(test);
var matrix:Matrix = new Matrix();
matrix.translate(-rect.x, -rect.y);
var bmp:BitmapData = new BitmapData(rect.width, rect.height, false, 0xFFFF0000);
bmp.draw(test, matrix);

// see if we are done
addChild(new Bitmap(bmp));

Когда я кодирую то, что использует много клипов для рисования, я создаю матрицу и каждый раз использую ее, выполняя matrix.identity(); для сброса преобразований. Нет необходимости создавать новую матрицу для каждого чертежа.

EDIT И нет, clipRect здесь не помогает. Вы используете его только тогда, когда хотите нарисовать что-то частично, а не весь клип.

0 голосов
/ 29 июня 2011

Неважно, я неправильно понял цель clipRect. http://pixelwelders.com/blog/actionscript-3/2008/as3-bitmapdata-foibles/. Использование матрицы для этого легко и решает проблему.

var mat:Matrix = new Matrix(1,0,0,1,-offsetX,-offsetY);
bmd.draw(this,mat);
...