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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

D3D游戏关于窗口中如何精确确定鼠标位置的相关讨论

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 D3D游戏关于窗口中如何精确确定鼠标位置的相关讨论 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在GameDev中的相關貼子:

(1)http://www.gamedev.net/topic/623813-getting-mouse-position/

里面有幾句很重要的話:

<1>How do you create your application window?
A common mistake is to choose some backbuffer resolution (for example 1024x768), create a backbuffer with this resolution and also create a window with this size - while forgetting, that if window is 1024x768 then its client area is smaller (because of the title bar and borders) and DirectX rendering will be stretched.?

<2>//一般我們取得坐標后,就可以橫坐標加8/2,縱坐標加28/2即可獲取真實的坐標,不過不同創建窗口的風格會導致不同的差異,所以請依據真實情況調整即可

?it's 8 pixels for borders and 28 pixels for the title bar (on my Vista, this depends on your OS and your settings, you can change the title bar size somewhere).?

(2)關于DInput取不了屏幕坐標的思考,及Windows Proc取坐標有問題的解決方案

http://www.gamedev.net/topic/423799-direct-input-mouse-position-wrong--fixed-/

<1>有一句話契合上面

Looks to me like you haven't used AdjustWindowRect() to get a 1:1 mapping of client area to backbuffer space. Your backbuffer may be 640x400 or something, but your entire window is also 640x400, meaning that the client area is around 632x380 or something. That means that a point on your client area won't map to the same place on the backbuffer.
AdjustWindowRect() will give you the dimensions to pass to CreateWindow[Ex]() if you give it the size of client area you want.?

?

小計:

???? 在我們獲取鼠標的位置時,假如沒有處理好創建窗口的步驟,很有可能取的是錯誤的坐標,像在龍書中就沒有指出這種情況,以至于在Pick一節中鼠標及射線不是很準確,甚至可以說簡直就是偏差的,那么如何來實現獲取準確的鼠標坐標的位置呢,首先建立窗口之前就應該調用一個函數AdjustWindowRect,這個函數可以調整窗口的大小,為什么要調大小,在上面的兩個帖子中講的很明白,因為窗口含有標題欄及左右上下邊框,使得我們的窗口小于我們創建的后臺緩存,這就會出現很大的問題,主要是鼠標往右下角走時,鼠標的位置會越來越不精確,正是由于前臺和后臺的大小的區別(前臺比后臺小),造成這么大的麻煩。而AdjustWindowRect這個函數可以在創建窗口前調整窗口大小,使現在的客戶區和后臺緩存一樣大,所以我們的整個窗口變大了點。這樣處理之后就可以正確獲取坐標了,樣例代碼如下:

RECT rc;
??SetRect( &rc, 0, 0, WIDTH, HEIGHT );
??AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, false );//注意這里好像只能用WS_OVERLAPPEDWINDOW,我測試了幾個其它的好象不行,下面的創建風格也要是WS_OVERLAPPEDWINDOW
// ??char szBuf[128];
// ??sprintf(szBuf,"(%d,%d),(%d,%d)",rc.left,rc.right,rc.top,rc.bottom);//這里查看調整后的窗口大小
// ??MessageBox(NULL,szBuf,"",MB_OK);

??hwnd=::CreateWindow(WNDCLASSNAME,WNDCAPTION,WS_OVERLAPPEDWINDOW,0,0,( rc.right - rc.left ),rc.bottom - rc.top,0,0,hInstance,0);

?

當然,一定還有其他方案解決此類問題,因為這里對窗口風格有點限定(也有可能我不會搭配風格使得有問題),不過在Dx SDK中是基于此來解決此問題的,這個方案可以使在窗口和全屏下都可以正確獲取坐標位置。還有一個就是在《DirectX+游戲開發終極指南》中GUI開發部分中,它的Demo在窗口模式下可以正常使用,但在全屏時卻不行,那里面很可能是在初始化d3dpp時有問題,所以那個也不是最終的解決方案。

總結

以上是生活随笔為你收集整理的D3D游戏关于窗口中如何精确确定鼠标位置的相关讨论的全部內容,希望文章能夠幫你解決所遇到的問題。

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