ZT DirectInput裡的鍵盤滑鼠的應用

2021-04-13 14:19:25 字數 3026 閱讀 5519

2023年10月12日 01:50:00

設計乙個pc遊戲,鍵盤滑鼠的輸入是絕不能少。windows也提供了諸如 wm_lbuttondown、wm_rbuttonup等滑鼠訊息以及wm_keydown、wm_keyup等鍵盤輸入訊息。但是 directinput中仍然提供了對滑鼠鍵盤的支援,其原因就是directinput提供乙個更直接更快捷的對輸入裝置的訪問方法。就象我們在dos 下直接接管鍵盤中斷,而不是去用什麼討厭的int16來處理鍵盤輸入一樣(用int16來處理鍵盤輸入其弊端在《金庸群俠傳》中顯得尤為明顯,人物在走路 之前總要頓那麼一下,就是這一下讓我覺得非常之不爽!其原因我想我也不用羅嗦了)。

當然windows的鍵盤訊息比之int16當然有了長足的進步(因為它提供了一 個wm_keyup訊息),但是在某些方面仍顯不足。因為windows的訊息機制是乙個緩衝(buffer)機制,未被處理的鍵盤滑鼠訊息都放在緩衝區 裡等待下一次處理,這樣對於一些應用軟體是非常重要的,但是對遊戲來說(特別是一些動作遊戲,包括體育遊戲)就顯得有蛇足之嫌了。舉個例子,在足球遊戲 裡,你去搶截對手的球——搶球和射門、鏟斷和長傳(大腳)總是設成同乙個鍵,這好像是個公認的標準了——但這時剛好對手的球脫腳了,球直接就到了你的腳 下,這時你本來想帶球繞過他的,可是你的搶球鍵已經按過了,由於這個該死的緩衝機制,先要處理一下這個搶球鍵(也就是射門鍵),於是你的動作就變成了一次 盲目的後場遠射(等同於大腳解圍)了。控制不了自己的動作,做球員做到這個份兒上真是夠失敗的了。這裡就是緩衝機制不適用的地方了。

而directinput提供了緩衝和立即兩種訪問輸入裝置的方式,對於立即方 式,正好就是解決上面弊病的方法。directinput裡關於鍵盤的初始化部分,已經在很早以前的一篇文章裡給出來了。雖是針對於directx7的, 但關於directinput部分在dx8和dx7裡差別不大,把lpdirectinput7換成lpdirectinput8、 lpdirectinputdevice7換成lpdirectinputdevice8就ok了,此外還有一點點需要改動的就是directinput 物件的建立,dx8裡用的是下面這個函式:

directinput8create(hinst, directinput_version, iid_idirectinput8,(lpvoid *)&lpdi, null);

裡面具體的引數大家看也看得出來,我就不多說了。

下面就給出directinput滑鼠物件的初始化**,只能這麼一步步的來,沒什麼好說的。 //

******************************===

lpdirectinput8  pdi;

lpdirectinputdevice8  lpmouse;

//存放滑鼠游標的su***ce

lpdirect3dsu***ce8  lpdscursor;

handle  hmouseevent;

//是有符號型,所以可以判斷游標是否移出螢幕來決定是否卷屏

short

mou***

=fullscreen_width/2

,mousey

=fullscreen_height/2

;bool

initinput()

現在是我們完全接管了滑鼠,那麼無可非議的,滑鼠游標的顯示任務也落到了我們頭上,不過在d3d8入門裡我提到了,游標的顯示可以由d3d8支援。下面我們就來建立乙個游標:

d3dlocked_rect  dlr;

//游標的su***ce只能是a8r8g8b8格式的,佔了乙個alpha位元組又不支援半透明,真是**** 

hres

=lpdevice

-<

createimagesu***ce(

32,

32, d3dfmt_a8r8g8b8,

&lpdscursor);

if(failed(hres))

return

false;

hres

=lpdscursor

-<

lockrect(

&dlr, null, 0);

if(failed(hres))

return

false;

//往su***ce裡寫資料呀,不用我說了吧

………………

hres

=lpdscursor

-<

unlockrect();

hres

=lpdevice

-<

setcursorproperties(0,

0, lpdscursor);

if(failed(hres))

return

false;

lpdevice

-<

showcursor(true);

接下來就是滑鼠資料的訪問了,這裡我只處理了滑鼠的移動。

void

mouseevent()

if(failed(hres) ||!

count)

break

;switch

(od.dwofs)}if

(x ||y)}

好了,現在算是完了。但是我個人覺得有一點小小的缺憾,大家如果試一下就會發現,滑鼠移動的總比windows下慢一些,這是為什麼?我在windows的滑鼠設定裡看到乙個加速選項,覺得可能是由於這個原因。那就模擬一下了。(以下只列出上面函式的改動部分)

short

xaccel,yaccel;

xaccel

=yaccel =1

;while(1

)………}

經過這樣改動後,滑鼠再移動起來果然順暢了很多。

此外,dideviceobjectdata結構中還有乙個時間標記,用這個可以 判斷滑鼠的雙擊,現在我們的滑鼠模擬已經初具雛形。自己接管滑鼠後,就可以定義方便自己的訊息比如什麼拖動啦(在windows下判斷拖動就是煩,自己定 義乙個)、三擊啦什麼的,好處是不言而喻的,當然也帶來了壞處——就是編寫的**就多了,不過這就是遊戲程式設計師的職責呀。

ZT DirectInput 滑鼠程式設計入門

2007年10月12日 01 49 00 樊一鵬前回同大家簡單介紹了如何用directinput來進行鍵盤程式設計,本回所要講述的就該是關於如何使用directinput來對另乙個非常重要的輸入裝置 滑鼠的程式設計問題。滑鼠的程式設計同鍵盤程式設計的過程是非常相似的,有了上次的基礎,你很快就能看出兩...

python裡 怎麼打 python裡的 怎麼輸入

python去重函式是什麼 用python寫溫度轉換 python中的 就是math.pi變數 它被包含在標準庫中,在你試圖自己計算它之前,應該先去匯入math庫,才能呼叫math.pi方法 import sys import math defmain ar if len ar 1 sys.exit...

裡的type python裡怎麼檢視資料型別

python裡怎麼檢視資料型別?python裡可以通過type 函式來檢視資料型別。python 內建函式 python 內建函式 python type 函式如果你只有第乙個引數則返回物件的型別,三個引數返回新的型別物件。12 3isinstance 與 type 區別 type 不會認為子類是一...