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游戏关于窗口中如何精确确定鼠标位置的相关讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker小实战和应用
- 下一篇: 熊猫烧香分析报告