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

來源:互聯網
上載者:User

回顧“被動方式”開發

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

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

“主動方式”的開發

主動方式即我們不需要向系統申請註冊捕捉某個遊戲手柄,我們只是根據自己的需要按時去擷取遊戲 手柄的狀態資訊。

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

/// <summary>
            /// 擷取操縱杆位置和按鈕狀態
            /// </summary>
            /// <param name="uJoyID"></param>
            /// <param name="pji"></param>
            /// <returns></returns>
            [DllImport("winmm.dll")]
            public static extern int joyGetPos(int uJoyID, ref JOYINFO pji);
            /// <summary>
            /// 擷取操縱杆位置和按鈕狀態
            /// </summary>
            /// <param name="uJoyID"></param>
            /// <param name="pji"></param>
            /// <returns></returns>
            [DllImport("winmm.dll")]
            public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.