BitmapData.draw clipRect未按预期工作

时间:2011-06-29 10:39:17

标签: flash actionscript-3 bitmapdata

我有一个包含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 个答案:

答案 0 :(得分:6)

常见的例行程序:

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. 进行翻译
  4. draw()电话中使用此矩阵。
  5. 在第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();重置变换。无需为每个图纸创建新的矩阵。

    编辑不,clipRect在这里没有帮助。只有在想要部分绘制某个内容时才使用它,而不是整个剪辑。

答案 1 :(得分:0)

没关系,我误解了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);