(AS3)BitmapData.draw比BitmapData.copyPixel能做得更多


BitmapData.drawBitmapData.copyPixel能做得更多

 

Flash一直讓人詬病的就是它的渲染效率,同屏的對象達到了一定程度后幀數就嘩嘩的降,不過幸好我們有BitmapData,很原始的位圖操作,API沒有DisplayObject那么好用,但效率卻有很大的改善,這也是Flash社區討論得很多的一個話題。

 

純位圖渲染比Flash自家的可視對象體系會快,但帶來的問題是難用,鼠標的交互也需要重新實現,網上有一些開源的位圖引擎:

1)fixelhttp://flixel.org/

2)FlashPunkhttp://flashpunk.net/

更多請參考:http://zengrong.net/flashassistant 

 

引擎的實現不是這里要講的話題,我想講的是BitmapData.drawBitmapData.copyPixel這兩上方法的區別。

關於BitmapDatahttp://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html 

 

copyPixel:像素拷貝,從源位圖上選取一個矩形區域,拷貝到目標位圖的指定點位置。

參數詳解:

sourceBitmapData:BitmapData — 要從中復制像素的輸入位圖圖像。源圖像可以是另一個 BitmapData 實例,也可以指當前 BitmapData 實例。

sourceRect:Rectangle — 定義要用作輸入的源圖像區域的矩形。 

destPoint:Point — 目標點,它表示將在其中放置新像素的矩形區域的左上角。 

alphaBitmapData:BitmapData (default = null) — 第二個 Alpha BitmapData 對象源。  

alphaPoint:Point (default = null) — Alpha BitmapData 對象源中與 sourceRect 參數的左上角對應的點。  

mergeAlpha:Boolean (default = false) — 若要使用 Alpha 通道,請將該值設置為 true。若要復制不含 Alpha 通道的像素,請將該值設置為 false。  

 

這里想重點說一下第456參數。第45參數一般是一起用,用來指定一個Alpha圖像源中的矩形區域,這個區域左上角由alphaPoint指定,寬高則和sourceRect一樣。當該區域中alpha通道為0時,則渲染后是透明的,為1時則為可見,由些,可以實現半透明乃致全透明的效果,在2D頁游中可以做出比較真實的遮擋效果,看下圖(左邊為使用了alphaBitmapData):

 

關於第6個參數,是否使用alpha混合,看個圖就明白了:

 

 

draw:繪制一個對象,該對象需要實現IBitmapDrawable接口,像DisplayObject

參數詳解:

source:IBitmapDrawable — 要繪制到 BitmapData 對象的顯示對象或 BitmapData 對象。(DisplayObject 和 BitmapData 類實現 IBitmapDrawable 接口。)  

matrix:Matrix (default = null) — 一個 Matrix 對象,用於縮放、旋轉位圖或轉換位圖的坐標。如果不想將矩陣轉換應用於圖像,請將此參數設置為恆等矩陣(使用默認 new Matrix() 構造函數創建),或傳遞 null 值。 

colorTransform:ColorTransform (default = null) — 一個 ColorTransform 對象,用於調整位圖的顏色值。如果沒有提供任何對象,則不會轉換位圖圖像的顏色。如果必須傳遞此參數但又不想轉換圖像,請將此參數設置為使用默認 new ColorTransform() 構造函數創建的 ColorTransform 對象。 

blendMode:String (default = null) — 來自 flash.display.BlendMode 類的一個字符串值,指定要應用於所生成位圖的混合模式。  

clipRect:Rectangle (default = null) — 一個 Rectangle 對象,定義要繪制的源對象的區域。如果不提供此值,則不會進行剪裁,並且將繪制整個源對象。  

smoothing:Boolean (default = false) — 一個布爾值,用於確定因在 matrix 參數中指定縮放或旋轉而對 BitmapData 對象進行縮放或旋轉以后,是否對該對象進行平滑處理。smoothing 參數只有在 source 參數是 BitmapData 對象時才適用。在將 smoothing 設置為 false 的情況下,經過旋轉或縮放的 BitmapData 圖像可能會顯得像素化或帶有鋸齒。 

 

里面有兩個參數matrixclipRectcopyPixel中的destPointsourceRect很像,但用法卻是天差地別。

copyPixel可以指定繪制的區域以及繪制到目標位圖的位置,draw也可以,但卻需要注意參數的用法和copyPixel是不同的。

matrix是矩陣轉換,可以進行位移,旋轉,縮放操作,但是但是,注意,這個操作都是對源位圖進行操作,並非是目標位圖上的操作,而clipRect也是指源位圖上的區域。

所以matrixclipRect這兩上參數的含義是:源位圖經過矩形轉換后,再從源位圖上拷貝clipRect指定的區域,到目標位圖上的clipRect區域,看清楚了,是目標位圖上的clipRect區域!

經過這樣理解后,我們可以把draw方法包裝一下:

 

public static function draw(target:BitmapData, source:IBitmapDrawable, rect:Rectangle, pt:Point, colorTransform:ColorTransform = null, scale:Number = 1):void
{
	clipRect.x = pt.x;
	clipRect.y = pt.y;
	clipRect.width = rect.width * scale;
	clipRect.height = rect.height * scale;
	matrix.tx = pt.x - rect.x;
	matrix.ty = pt.y - rect.y;
	matrix.a = matrix.d = scale; //x,y分別縮放
	target.draw(source, matrix, colorTransform, null, clipRect, false);
}

  

包裝后的用法就和copyPixel一樣了。

而且更重要的是,draw可以縮放,可以顏色轉換,可以濾鏡。

 

*關於colorTransform參數,游戲中一個人物受擊的時候,我們會給把人物的形象變紅,colorTransform.redOffset=100,這樣人物的紅色通道就會更深,當人物中毒的時候,可以加深綠色通道,當人物燒焦的時候,變黑等等。

 

最后,copyPixel的效率比draw高,所以一般情況下,copyPiexl用得比較多,draw會用在比較特殊的地方,而且不會每幀都調用,選擇性的調用。

當然用copyPiexl還是draw都是需要根據情況而定,參考:http://www.fans8.com/?p=512 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM