DirectX学习笔记_关于Sprite.Draw2D的说明
在DirectX的Sprite中提供一個Draw2D的方法,該方法繪制一個Sprite對象用于二維空間中顯示,在DirectX 9.0C中,該方法有6個重載,分別是?
2?public?void?Draw2D(Texture?srcTexture,?PointF?rotationCenter,?float?rotationAngle,?PointF?position,?int?color);
3?public?void?Draw2D(Texture?srcTexture,?Rectangle?srcRectangle,?SizeF?destinationSize,?PointF?position,?Color?color);
4?public?void?Draw2D(Texture?srcTexture,?Rectangle?srcRectangle,?SizeF?destinationSize,?PointF?position,?int?color);
5?public?void?Draw2D(Texture?srcTexture,?Rectangle*?srcRectangle,?SizeF*?destinationSize,?PointF*?center,?float?rotationAngle,?PointF?position,?int?color);
6?public?void?Draw2D(Texture?srcTexture,?Rectangle?srcRectangle,?SizeF?destinationSize,?PointF?rotationCenter,?float?rotationAngle,?PointF?position,?Color?color);
7?public?void?Draw2D(Texture?srcTexture,?Rectangle?srcRectangle,?SizeF?destinationSize,?PointF?rotationCenter,?float?rotationAngle,?PointF?position,?int?color);
這里我將以?
?public?void?Draw2D(Texture?srcTexture,?Rectangle?srcRectangle,?SizeF?destinationSize,?PointF?rotationCenter,?float?rotationAngle,?PointF?position,?Color?color);作為例子來說明該方法實現的效果,其余重載函數均是參數個數和類型不同。
參數說明(*注意:我們所說的紋理大小和實際圖片大小不同,即紋理的高寬并不等于實際圖片的高寬,稍后會有說明)
Texture?srcTexture——源紋理;
Rectangle?srcRectangle——顯示紋理的矩形范圍,由矩形左上角坐標和寬高共4個參數描述,當矩形范圍小于源紋理大小時可用于切割圖片,指定Empty不使用;
SizeF?destinationSize——紋理的高寬,可用于縮放紋理,指定Empty為使用源紋理大小;
PointF?rotationCenter——紋理旋轉軸點坐標,在給該參數賦值時需要注意兩個情況,一個是軸點在紋理范圍內,一個是在紋理外,兩種情況下賦值不一樣,稍后說明;
float?rotationAngle——旋轉度數,此處使用弧度為計量單位;
PointF?position——紋理顯示位置,即紋理左上角坐標,決定紋理在哪里進行繪制;
Color?color——顏色覆蓋,取White時候透明處理;
當圖片通過TextureLoader.FromFile()加載進來后,給方法把原始圖片解釋為一個紋理,此時紋理的大小不再是原始圖片的大小,也就是說紋理的高寬和于是圖片的高寬在數值上并不相等,紋理的大小為2的冪。
Render()渲染方法
2?{
3????????sprite.Begin(SpriteFlags.AlphaBlend);//開始繪制
4????????
5????????sprite.Draw2D(srcTexture,?Rectangle.Empty,SizeF.Empty,?PointF.Empty,?0.0f,?new?PointF(50,?50),?Color.White);??//基本繪制?
6?
7????????sprite.End();//結束繪制
8?????????????
9?}
上述代碼中,我們將紋理繪制在50×50處,其他參數使用默認,測試用圖片大小為100×100
但紋理繪制出來以后會發現 此時紋理的高寬并不是100×100,而是128×128,(紋理的大小為2的冪),如果要顯示與原始圖片大小相同的紋理,則將第三個參數改為new SizeF(100,100)即可:(我們可以通過GetLevelDescription()方法來獲取紋理的高寬)
2?{
3????????sprite.Begin(SpriteFlags.AlphaBlend);//開始繪制
4????????
5????????sprite.Draw2D(srcTexture,?Rectangle.Empty,new?SizeF(100,100),?PointF.Empty,?0.0f,?new?PointF(50,?50),?Color.White);??//基本繪制?
6?
7????????sprite.End();//結束繪制
8?????????????
9?}
?
下面我們來討論關于第4個參數紋理旋轉軸點坐標。
剛才我們說到這個參數的賦值分不同的情況考慮,如果指定為Empty則以紋理左上角坐標為軸點坐標。
設定條件為 紋理位置(左上角坐標)為(10,10),原始圖片高寬為100*100,我們想讓圖片以自己的中心點為軸點旋轉,照常理,此時軸點坐標應該為(60,60),當我們將此作為軸點坐標傳入方法運行后發現 圖形并沒有以自己的中心點為軸點旋轉,而是偏離了一些。(如果看不清可以寫一個for循環畫出360張紋理即可以表示軌跡)
此時回到最初的問題,紋理的大小并不是100*100,而是128*128,那我們傳入(69,69)應該就是對的了,于是我們再次運行發現還是存在偏差 紋理的4個角并沒有與軌跡相接。
正確的賦值應該是(64,64),即128的一半。
于是我們得到以下規律
如果需要紋理以本身紋理以外的點為軸點旋轉,傳入該點坐標即可,如果我們需要以紋理范圍內的點為軸點則需要換算坐標信息,例如中點 比例是1/2,所以將比例系數乘以128(128可以通過GetLevelDescription()獲取)!
總結
以上是生活随笔為你收集整理的DirectX学习笔记_关于Sprite.Draw2D的说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误检测dP-bitstream-ei_
- 下一篇: 关于Direct2D