複製鏈接
請複製以下鏈接發送給好友

遊戲操縱桿

鎖定
在Windows環境下通過編程來操縱鼠標、鍵盤是一件再簡單不過的事了,不過大家有沒有想過要嘗試一下另一樣我們比較常見的輸入工具——遊戲操縱桿呢?在某些情況下,尤其是象編制一些小型的遊戲軟件的時候,加入對遊戲操縱桿的支持可以給使用者提供更為友好的人機界面,極大的提高遊戲軟件的可玩性。
中文名
遊戲操縱桿
外文名
Joystick
意    義
提高遊戲軟件的可玩性
性    質
屬外部擴展

遊戲操縱桿背景介紹

隨着技術的不斷髮展,現在手上人人配備的手機似乎正在凝聚着人間所有高新科技的一切美好的成果,可想而知,隨着手機的不斷進步,外部擴展,包括存儲卡、電池、耳機線都將被其帶動,那就是遊戲操縱桿。

遊戲操縱桿使用

C++Builder中沒有專門控制操縱桿函數(其實在常見的編程語言中基本上都沒有),因此要增加對遊戲操縱桿的支持,就要和Windows的MCI API函數打交道,在讀取操縱桿的屬性、狀態,位置和按鈕信息時要用到的API函數、常量及數據結構。

遊戲操縱桿相關常量

#define MM_JOY1MOVE 0x3A0 /* 用以傳遞操縱桿當前狀態的一些消息 */
#define MM_JOY2MOVE 0x3A1
#define MM_JOY1ZMOVE 0x3A2
#define MM_JOY2ZMOVE 0x3A3
#define MM_JOY1BUTTONDOWN 0x3B5
#define MM_JOY2BUTTONDOWN 0x3B6
#define MM_JOY1BUTTONUP 0x3B7
#defineMM_JOY2BUTTONUP 0x3B8
#define JOY_BUTTON1 0x0001 /* 用以表明當前操縱桿的狀態 */
#define JOY_BUTTON2 0x0002
#define JOY_BUTTON3 0x0004
#define JOY_BUTTON4 0x0008
#define JOY_BUTTON1CHG 0x0100
#define JOY_BUTTON2CHG 0x0200
#define JOY_BUTTON3CHG 0x0400
#define JOY_BUTTON4CHG 0x0800
/* 遊戲操縱桿錯誤返回值 */
#define JOYERR_BASE 160
#define JOYERR_NOERROR (0) /* 正常 */
#define JOYERR_ParmS (JOYERR_BASE+5) /* 參數錯誤 */
#define JOYERR_NOCANDO (JOYERR_BASE+6) /* 無法正常工作 */
#define JOYERR_UNPLUGGED (JOYERR_BASE+7) /* 操縱桿未連接 */
/* 操縱桿標識號 */
#define JOYSTICKID1 0
#define JOYSTICKID2 1

遊戲操縱桿相關函數

WINMMAPI UINT WINAPI joyGetNumDevs(void);
獲取設備標識號。
MMRESULT WINAPI joyGetDevCaps(UINT uJoyID, LPJOYCAPS pjc, UINT cbjc);
獲取操縱桿屬性信息,以結構體JoyCaps接收。
WINMMAPI MMRESULT WINAPI joyGetPos(UINT uJoyID, LPJOYINFO pji);
獲取操縱桿位置和按鈕狀態,以結構體接收。
WINMMAPI MMRESULT WINAPI joyGetThreshold(UINT uJoyID, LPUINT puThreshold);
讀取操縱桿移動閾值。
WINMMAPI MMRESULT WINAPI joyReleaseCapture(UINT uJoyID);
結束對操縱桿信息的接收。
WINMMAPI MMRESULT WINAPI joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod,
BOOL fChanged);
設置接收某一操縱桿的信息的窗口以及將何種頻度接收。
WINMMAPI MMRESULT WINAPI joySetThreshold(UINT uJoyID, UINT uThreshold);
設置操縱桿移動閾值。
相關結構體: typedef struct joyCaps{
WORD wMid; /* 製造商標識 */
WORD wPid; /* 生產編號 */
char szPname[MAXPNAMELEN]; /* 產品名稱 */
UINT wXmin; /* X軸最小值 */
UINT wXmax; /* X軸最大值 */
UINT wYmin; /* Y軸最小值 */
UINT wYmax; /* Y軸最大值 */
UINT wZmin; /* Z軸最小值 */
UINT wZmax; /* Z軸最大值 */
UINT wNumButtons; /* 按鈕數 */
UINT wPeriodMin; /* 最小調用間隔時間(單位 毫秒)*/
UINT wPeriodMax; /* 最大調用間隔時間(單位 毫秒)*/
}JOYCAPS, *PJOYCAPS, NEAR *NPJOYCAPS, FAR *LPJOYCAPS;
typedef struct joyInfo{
UINT wXpos; /* x 軸位置 */
UINT wYpos; /* y 軸位置 */
UINT wZpos; /* z 軸位置 */
UINT wButtons; /* 按鈕狀態 */
} JOYINFO, *PJOYINFO, NEAR *NPJOYINFO, FAR *LPJOYINFO

遊戲操縱桿驅動

程序需要首先檢查遊戲操縱桿的存在,這包括了檢查驅動程序支持和確認操縱桿已與系統相連的兩項工作。joyGetNumDevs調用檢查系統是否配置了遊戲端口和驅動程序。如果返回值為零,表明不支持操縱桿功能。如果joyGetNumDevs返回值不為零,則説明系統支持遊戲操縱桿功能。但joyGetNumDevs並不能確定操縱桿是否已被連接上了,通過調用可以完成這些工作,並檢查是否有錯誤發生。
如果有遊戲端口,joyGetNumDevs返回值通常為16.
一旦確認了操縱桿已連上,就可以接受器發來的消息。joySetCapture通知Windows操縱桿消息應發送到哪裏機發送的頻率如何。
joySetCapture中的第一個參數通知Windows誰將得到消息,第二個參數確定程序將從那個操縱桿接收消息。第三個參數時表示希望以怎樣的頻度接受JM_MOVE消息(單位為毫秒),無論操縱桿是否移動,都將以這個頻度接受JM_MOVE消息。joySetCapture的四個參數允許程序當操縱桿移動一定的距離後才接受消息。該距離由joySetThreshold設置。
joySetCapture被調用後,窗口將接受操縱桿事件。MM_JOYXMOVE(X=操縱桿號)事件已joySetCapture定義的時間間隔發生。只有當操縱桿的按鈕被按下時,MM_JOYXBUTTONUP和MM_JOYXBUTTONDOWN事件才發生。操縱桿時間出發句柄,改變相應的標籤狀態信息。移動消息也同時通知程序在新的位置重畫操縱桿標誌。調用joyReleaseCapture通知Windows已結束操縱桿的調用。

遊戲操縱桿編制程序

在實際編制程序時,應首先在Form1的頭文件Form1.h中加入對mmsystem.h的引用,再加入一些相關的消息映射即對MM_JOYXMOVE、MM_JOYXBUTTONUP和MM_JOYXBUTTONDOWN事件的響應函數説明。
#include
//--------------------
class Tform1:public TForm
{ __published:
private:
TPoint Position;//用於存儲操縱桿的座標位置。
public:
MESSAGE_HANDLER(MM_JOY1BUTTONDOWN,TMessage,JMButonUpdate)

遊戲操縱桿應用

用遊戲操縱桿摸擬鼠標
調用API函數joySetCapture能捕獲遊戲操縱桿。調用joySetCapture函數後,操縱桿產生的所有消息將會發送到指定的窗口。它的原型為:
MMRESULT joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged );
其中,參數hwnd為接收操縱桿消息的窗口句柄;參數uJoyID為要捕獲的操縱桿標識,它可以是JOYSTICKID1或是JOYSTICKID2,即第一、第二個遊戲操縱桿;參數uPeriod為輪詢的頻率,單位為毫秒,它指定給應用程序發送有關操縱桿信息的間隔時間;參數fChanged為改變位置標識,可設為false。
要釋放操縱桿的捕獲時,使用joyReleaseCapture函數。它只有一個參數,就是操縱桿的標識JOYSTICKID1或JOYSTICKID2。