XNA-2D SpriteBatch.Draw的七個多載

XNA-2D SpriteBatch.Draw的七個多載

SpriteBatch.Draw有七種樣子,每個都有好用的地方,簡單的2D特效就直接呼叫這些函式就可以容易達到!就讓我們看看有那些!

一. SpriteBatch.Draw (Texture2D, Vector2, Color)

這是最簡單的樣式,我們之前的demo都是呼叫此函式,參數分別是2D圖形物件(texture),顯示座標(position),顏色遮罩(color),這裡稍微說明一下顏色遮罩,

 

 

假設我們一張圖有兩種顏色~藍色和綠色(喔!~好敏感的顏色),rgb值分別為0,0,255和0,255,0,

我們選用黃色的遮罩(255,255,0),這樣遮下去會發生什麼事呢?

遮罩並不事把顏色混合喔,這張藍綠的圖會變成黑和綠了!

算法很簡單,先將遮罩標準化,三個顏色都除以255,然後再乘上原來的顏色就是結果的顏色了。

像是我們要畫煙火的火花,每個火花都是單一顏色,但是會不斷變化,就可以用白色的圖,然後改變遮罩來變換顏色,

之前紅色小球的例子,我們也可以改成用白色的球,然後用遮罩該變他的顏色,這樣很多球可以有不同顏色,但是卻只需要一張圖,方便又節省!

 

二.SpriteBatch.Draw (Texture2D, Rectangle, Color)

這和第一個很像,但是中間變成Rectangle(destinationRectangle),他是一個矩形物件,重要的有X,Y,Width,Height這四個屬性,

X,Y是此矩形左上角的座標,Width,Height就是他的長和寬了。

這裡的矩形物件是用來標示圖形的顯示位置的,和上面的Vector2不同的地方是,除了可以決定圖形的左上角座標,還可以決定圖形的大小,也就是有縮放的功能。

讓我們來看看例子:

未命名 -3

左邊是原尺寸娜歐,右邊是長寬150的娜歐。

 

三.SpriteBatch.Draw Method (Texture2D, Vector2, Nullable<Rectangle>, Color)

四.SpriteBatch.Draw Method (Texture2D, Rectangle, Nullable<Rectangle>, Color)

第三個和第四個一起講,因為們一樣只多了一個Nullable<Rectangle>的參數(sourceRectangle),其他和上面兩個函式相同。

這多出來的參數是讓我們決定來源圖的位置,也就是可以不要把整張圖都貼出來,只貼想要的部份。

我最常用到此參數的地方就是動畫,把許多連續的圖檔連接成一張大圖,然後定時改變顯示的部位,就可以達到2D動畫的效果。

當然,如果你傳入null的話,就是整張圖都顯示了。

 

五.SpriteBatch.Draw Method (Texture2D, Rectangle, Nullable<Rectangle>, Color, Single, Vector2, SpriteEffects, Single)

第五個多載後面多了四個參數,Color之後依序是旋轉角度(rotation)、原點座標(origin)、特效(effects)、深度(layerDepth)。

旋轉角度是以弧度為單位,順時針轉,所以輸入360可不只轉一圈,而要旋轉的話就一定要有一個固定點,那就是接著的原點座標,你可以想像一張圖被釘上圖釘的感覺,

之前的那些函式沒有設定原點座標,所以預設都是圖的左上角,也就是(0,0)。

此原點座標不光只是為了旋轉而已,一旦你設定此參數,移動和縮放都會被影響,如下圖,黑色是沒設定原點且不縮放也不旋轉。

此圖紅線原點設定為(0,0),分別是直接貼圖、放大、旋轉。

未命名 -4

此圖紅線原點設為(14,14),分別是直接貼圖、放大、旋轉。

未命名 -2

上面兩張圖的紅線參數完全一樣,只有原點不同而已,可以看得出來都是以原點做計算。

下一個參數是SpriteEffects,他是列舉型別(enum)有三個值分別是None、FlipHorizontally、FlipVertically,

他在這裡的功能只是相圖形左右映射和上下映射而已,用來作鏡子貼圖不錯用,

可以用|連結起來,像這樣「SpriteEffects.FlipHorizontally | SpriteEffects.FlipVertically」,這樣只是上下左右顛倒而已。

最後一個參數是深度,數字是0到1之間,會影響畫圖的先後順序,0是前面1是後面,然後根據SpriteBatch.Begin裡的SpriteSortMode決定畫的順序,

當你畫面上有很多物件時,先後的順序是很需要好好規劃的。

關於SpriteBatch.Begin參數的說明請看上一篇XNA-2D SpriteBatch.Begin和SpriteBatch.End

 

六.SpriteBatch.Draw Method (Texture2D, Vector2, Nullable<Rectangle>, Color, Single, Vector2, Single, SpriteEffects, Single)

七.SpriteBatch.Draw Method (Texture2D, Vector2, Nullable<Rectangle>, Color, Single, Vector2, Vector2, SpriteEffects, Single)

最後這兩個多載比第五種函式多了一個縮放,放在倒數第三個參數(scale),因為他指定畫圖位置的第二個參數只能設定畫出的位置,所以要縮放的話就要在後面設定,

第六種函式的縮放參數是一個float,為等比例縮放,第七種函式的縮放參數是Vector2,用來作不同比例的縮放。