日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DirectX学习笔记_关于Sprite.Draw2D的说明

發布時間:2023/12/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DirectX学习笔记_关于Sprite.Draw2D的说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


在DirectX的Sprite中提供一個Draw2D的方法,該方法繪制一個Sprite對象用于二維空間中顯示,在DirectX 9.0C中,該方法有6個重載,分別是?

1?public?void?Draw2D(Texture?srcTexture,?PointF?rotationCenter,?float?rotationAngle,?PointF?position,?Color?color);
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的冪。

1?Texture?srcTexture?=?TextureLoader.FromFile(device,?imagePath//圖片路徑);


Render()渲染方法

1?public?override?void?Render2D()
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()方法來獲取紋理的高寬)

1?public?override?void?Render2D()
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

總結

以上是生活随笔為你收集整理的DirectX学习笔记_关于Sprite.Draw2D的说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。