2011-06-29 57 views
3

我有一個包含4層的組件:(按升序深度順序)bgImage:Sprite,dropZone:Sprite,dropMask:Sprite和line:Sprite。 bgImage爲0,0,其他對象放置在各個正座標處。 dropMask掩蓋了dropZone。BitmapData.draw clipRect按預期工作

在位圖捕獲我只想從懸浮窗和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並使用矩陣嗎?

回答

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,這個矩陣中draw()調用它翻譯-rectangle.y
  3. 使用。

在步驟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在這裏沒有幫助。只有當你想要畫一些部分而不是整個剪輯時才使用它。

+0

是的,這是我最終做的,然後進一步使矩陣預先縮放和定位在同一時間。 – shanethehat