天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

C#對游戲手柄的編程開發-API篇(2)

回顧“被動方式”開發

C#對游戲手柄的編程開發-API篇(1)這篇文章中我們介紹了“被動方式”的開發。在此方式下,我們的程序只扮演一個消息接收者。系統會定時告訴我們某個游戲手柄當前的狀態,我們的程序接收到后再按實際需要進行處理即可。但如果你是一個細心的人,你會發現如果直接按消息事件處理的話會存在一個問題,如我們按下某個鍵(比如向上的方向鍵)然后放開時,對于我們“人”來說,我們按下與彈起的這兩個動作應該只是說明我們只點擊這個按鈕一次。但對于系統來說,它只是機械地定時通知我們的程序在某個時間游戲手柄的各個按鈕的狀態,而在我們按下到彈起這段時間內,系統有可能已經傳遞了N次的消息通知(N值根據捕捉時設置的uPeriod值與你的按鍵速度來決定),通知手柄有按鈕處于被按下狀態,而如果我們就根據消息包直接處理點擊事件的話,就會導致問題出現(比如在某個游戲中,我們設計的是當點擊一次手柄的右鍵,就將角色向前移動一步。但從我們按下按鈕到彈開此按鈕這段時間,由于人的反應速度遠遠慢于電腦的處理速度,所以這段很短的時間內,系統可能已通知了10次以上的消息包表明游戲手柄右鍵已被按下,這就導致我們按一次右鍵,游戲中的角色卻有可能已移動了十步之多,這可不是我們想要的結果)。那我們要怎樣處理這個“點擊”事件才可以避免重復通知呢?這就是本篇最后要重點講解的內容了……

在講解這個問題的解決方法之前我們再來講解一下上文還提到的一種開發方式。

“主動方式”的開發

主動方式即我們不需要向系統申請注冊捕捉某個游戲手柄,我們只是根據自己的需要按時去獲取游戲手柄的狀態信息

這時我們就要用到以下的API函數。

///             /// 獲取操縱桿位置和按鈕狀態            ///             ///             ///             ///             [DllImport("winmm.dll")]            public static extern int joyGetPos(int uJoyID, ref JOYINFO pji);            ///             /// 獲取操縱桿位置和按鈕狀態            ///             ///             ///             ///             [DllImport("winmm.dll")]            public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji);

 

上面的兩個API函數,我們可以從中任選一個,但joyGetPos函數只能取得1,2,3,4號四個按鈕的狀態。所以建議不用,下面只重講解joyGetPosEx函數

JOYINFO 與 JOYINFOEX 是屬于結構體,它們的定義如下:

 

 

Code
#region 游戲手柄的位置與按鈕狀態
/// <summary>
/// 游戲手柄的位置與按鈕狀態
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct JOYINFO
{
public int wXpos;
public int wYpos;
public int wZpos;
public int wButtons;
}
/// <summary>
/// 游戲手柄的位置與按鈕狀態
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct JOYINFOEX
{
/// <summary>
/// Size, in bytes, of this structure.
/// </summary>
public int dwSize;
/// <summary>
/// Flags indicating the valid information returned in this structure. Members that do not contain valid information are set to zero.
/// </summary>
public int dwFlags;
/// <summary>
/// Current X-coordinate.
/// </summary>
public int dwXpos;
/// <summary>
/// Current Y-coordinate.
/// </summary>
public int dwYpos;
/// <summary>
/// Current Z-coordinate.
/// </summary>
public int dwZpos;
/// <summary>
/// Current position of the rudder or fourth joystick axis.
/// </summary>
public int dwRpos;
/// <summary>
/// Current fifth axis position.
/// </summary>
public int dwUpos;
/// <summary>
/// Current sixth axis position.
/// </summary>
public int dwVpos;
/// <summary>
/// Current state of the 32 joystick buttons. The value of this member can be set to any combination of JOY_BUTTONn flags, where n is a value in the range of 1 through 32 corresponding to the button that is pressed.
/// </summary>
public int dwButtons;
/// <summary>
/// Current button number that is pressed.
/// </summary>
public int dwButtonNumber;
/// <summary>
/// Current position of the point-of-view control. Values for this member are in the range 0 through 35,900. These values represent the angle, in degrees, of each view multiplied by 100.
/// </summary>
public int dwPOV;
/// <summary>
/// Reserved; do not use.
/// </summary>
public int dwReserved1;
/// <summary>
/// Reserved; do not use.
/// </summary>
public int dwReserved2;
}
#endregion

NET技術C#對游戲手柄的編程開發-API篇(2),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品久久久久久无码人妻国产馆 | 猛烈抽插H1V1 | 精品国产露脸久久AV麻豆 | GAY东北澡堂激情2022 | 亚洲精品免费在线视频 | 青青草 久久久 | AV一区AV久久AV无码 | 美女拉开腿让男生桶到爽 | 伊人久久青草青青综合 | 大香网伊人久久综合观看 | 一二三四在线观看高清电视剧 | 国产成人片视频一区二区青青 | 男女XX00上下抽搐动态图 | 真人裸交有声性动态图 | 亚洲一区二区三不卡高清 | 极品少妇高潮XXXXX | FREE性丰满HD毛多多 | 杨幂视频1分11未删减在线观看 | 99精品免费在线观看 | 国产高清精品自在久久 | 午夜在线观看免费完整直播网 | 国产传媒在线观看 | 久久青青草原综合伊人 | 一个人免费播放高清在线观看 | 37大但人文艺术A级都市天气 | 国产精品卡1卡2卡三卡四 | 又亲又揉摸下面视频免费看 | 巨乳中文无码亚洲 | 久在线观看福利视频 | 美女大鸡鸡 | 手机国产视频福利 | 久久久国产精品免费A片蜜臀 | 中文字幕人成人乱码亚洲影视 | 亚洲AV永久无码精品澳门 | 午夜视频无码国产在线观看 | 亚洲第一免费播放区 | xxx暴力xxx | 成人国产在线不卡视频 | 91黄色大片 | 推倒美女总裁啪啪 | 国产精品99久久免费黑人人妻 |