前段時間花38元從網上買了一對北通的usb遊戲手柄,這樣週末與晚上的休閒時間就可以玩玩孩兒時的sfc與街機模擬遊戲了。
某日在某個**上玩乙個flash遊戲時,突然想到,如果也能使用手柄來玩flash遊戲,那該多爽
雖然flash中不支援對遊戲手柄進行程式設計,但我們可以換種方法,做乙個輔助程式(外掛程式?
(注:類似這樣的功能,網路已有現成的軟體,是乙個日本人開發的,叫joytokey)
對遊戲手柄進行操作,大概有兩種方式:採用系統api或者使用directinput操作遊戲手柄裝置。(也許還有其它方式,但我的知識範圍有限,其它方式就不得而知了)
採用系統api是一種最簡單的方式,因為系統已幫我們封裝好了所有細節,我們只要在程式中定時取得遊戲手柄裝置的狀態就可以了(輪循)。
操作遊戲手柄(杆)的api有以下幾個:
函式名稱函式說明
joygetnumdevs
獲取當前系統支援的遊戲裝置數量
joygetdevcaps
查詢獲取指定的遊戲杆裝置以確定其效能
joysetcapture
向系統申請捕獲某個遊戲裝置並定時將該裝置的狀態值通過訊息傳送到某個視窗
joyreleasecapture
釋放對某個遊戲裝置的捕獲
joygetpos
獲取遊戲裝置的座標位置和按鈕狀態
joygetpo***
獲取遊戲裝置的座標位置和按鈕狀態
joygetthreshold
查詢指定的遊戲杆裝置的當前移動閾值
joysetthreshold
設定指定的遊戲杆裝置的移動閾值
其中,根據呼叫不同的方法又可分為兩種方式。
1)被動方式:
呼叫joysetcapture方法,向系統申請對某個遊戲手柄的捕捉,如果成功申請,系統將會定時將此遊戲手柄的狀態資訊通過訊息方式通知到我們的某個視窗上。
2)主動方式:
即是根據我們自己的需要,按需呼叫joygetpos或joygetpo***方法查詢獲取某個遊戲手柄的當前狀態。
而在本篇中,我們要講解的只是「被動方式」。
joysetcapture方法的c#定義原型如下:
//////
向系統申請捕獲某個遊戲杆並定時將該裝置的狀態值通過訊息傳送到某個視窗
//////
視窗控制代碼
///指定遊戲杆(0-15),它可以是joystickid1或joystickid2
///每隔給定的輪詢間隔就給應用程式傳送有關遊戲杆的資訊。這個引數是以毫妙為單位的輪詢頻率。
///是否允許程式當操縱桿移動一定的距離後才接受訊息
///[dllimport(
"winmm.dll")]
public
static
extern
intjoysetcapture(intptr hwnd,
intujoyid,
intuperiod,
bool
fchanged);
當我們呼叫此方法向系統申請捕獲某個遊戲手柄後,如果成功,則返回joyerr_noerror(值為0),否則返回其它值的話表示申請失敗。並且在不再需要捕獲遊戲手柄時要記得呼叫joyreleasecapture方法釋放捕捉。
如果申請成功,系統將會定時(根據uperiod的值決定時間的長短)將遊戲手柄的狀態以訊息包形式傳送到hwnd對應的視窗介面。所以我們必須要在程式中處理對應的訊息(如重寫wndproc方法進行處理)。
並且根據不同的
ujoyid值,系統傳送的訊息號又會有所不同,如對於
joystickid1系統將會分別傳送以下訊息包:
訊息號說明
mm_joy1move
當手柄的位置已變動或按了某些按鈕時,將會傳送此訊息包。
mm_joy1buttondown
當手柄的a,b,c,d四個按鈕中的乙個或多個正被按下時,將會傳送此訊息包。
mm_joy1buttonup
當手柄的a,b,c,d四個按鈕中的乙個或多個正被彈起時,將會傳送此訊息包。
而對於joystickid2 系統發出的訊息包分別為mm_joy2move、mm_joy2buttondown、mm_joy2buttonup!
並且要注意!不管你有沒有按遊戲手柄上的按鈕,系統也會定時傳送mm_joyxmove訊息!!
怎樣判斷按了哪些鍵?
在訊息包中,遊戲手柄的狀態資訊(按鈕狀態)分別儲存在訊息包中的wparam與lparam引數。
1)wparam引數:
對於遊戲手柄來說wparam儲存的是除了上下左右四個方向鍵之外的所有按鈕中當前被按下的按鈕值,它的值是乙個復合值。如它的值為joy_button1 | joy_button2時,就表明按下的按鍵是1號和2號按鈕。
注意:對於mm_joyxbuttondown與mm_joyxbuttonup兩個訊息,用於判斷的按鈕值是不同於mm_joyxmove的按鈕值!!
2)lparam引數:
此引數儲存的是遊戲手柄的座標引數,並且此引數的高16位儲存的是y座標值,低16位儲存的是x座標值。
而對於遊戲手柄來說,判斷上下左右四個方向鍵有沒有被按下就是通過此引數進行判斷的。如果當四個方向鍵都沒有被按下時,表示當前遊戲手柄處於中心座標中!也就是x,y座標都是在中心點位置上,而當某些方向鍵被按下時,x,y座標將根據所按的鍵向對應方向偏移。如當按了向右鍵,則x座標向右偏移,y座標保持在中心點位置,而如果按了右、上兩個方向鍵同時按下,則x座標向右偏移,y座標向上偏移。所以我們可以根據lparam引數取得x,y座標的值,然後再根據其中心點來判斷。參考**如下:
//////
獲取x,y軸的狀態
//////
///private
void
getxybuttonsstatefromlparam(
intlparam,
refjoystickbuttons buttons)
else
if(x
<
m)if
(y >
m)else
if(y
好了,對遊戲手柄的「被動方式」程式設計就講解完成了,剩下的就是要怎麼利用遊戲手柄來實現模擬鍵盤或滑鼠的操作了……
ps:如果各位有興趣的可考慮一下怎麼實現遊戲手柄的「主動方式」程式設計開發。
/files/kingthy/joykeys.rar
Html5遊戲開發攻略(API篇)
如果我們要做乙個完整的遊戲,一般都有哪些效果呢?首先,我們肯定是需要全屏的,而且,3d遊戲還有滑鼠鎖定的功能。這些功能有很大一部分都是html5內建的,但是某些功能,比如畫布同比縮放之類則需要我們手動去 實現了。下面,我將乙個乙個詳細的寫給各位看官。fullscreen api api分為兩部分,進...
在遊戲開發中的使用icade手柄
當ab兩個按鍵同時按下時,會表示為手柄上的g鍵被按下,同時ab兩個按鍵被鬆開。當cd兩個按鍵同時按下時,會表示為手柄上的h鍵被按下,同時cd兩個按鍵被鬆開。在網上找到了乙個相關的 手柄使用鍵盤的按鍵來代替手柄按鍵,實際上icade手柄是作為乙個鍵盤連線到遊戲中的。下邊是icade規定的按鍵值 up ...
C 事件程式設計在遊戲開發的應用
2d碰撞檢測 system.action 等於快捷建立乙個委託 使用泛型方式定義 public void callui actionobject callback,params object args where t cuibase 使用 cuimanager.instance.callui ui,...