當前位置:編程學習大全網 - 編程語言 - 遊戲桿編程心得二:如何判斷按鈕的有效按下

遊戲桿編程心得二:如何判斷按鈕的有效按下

在遊戲桿編程中通過壹般需要獲取按鈕狀態來執行特定事件,比如實現按下按鈕1壹次,變量num遞增100,但在調試系統時往往會出現這種情況:明明按下按鈕壹次,但是變量num已經遞增了好幾百。這是怎麽回事呢?開始我有點百思不得其解。但經過查看程序和思考,我找到了原因。原來程序中我使用了時鐘事件,設置了壹個時鐘,這個時鐘表示系統每50毫秒獲取遊戲桿的按鈕狀態,具體代碼如下:SetTimer( hDlg, 0, 50, NULL );同時在Ontimer函數裏判斷按鈕按下時我采用了這樣的判斷語句:// js.rgbButtons[0]表示按鈕1,js.rgbButtons[0] & 0x80表示按鈕1處於被按下狀態if( js.rgbButtons[0] & 0x80 ){num = num +100;}後來我認為這種判斷條件是有問題。問題在哪裏?主要是沒有考慮狀態的實時更新性,為什麽會出現按下按鈕壹次,但是變量num已經遞增了好幾百的情況下?這是因為人按下按鈕的持續時間(即按鈕從被按下到彈起的時間間隔)是不確定,有可能是幾十毫秒或幾秒,但系統獲取按鈕狀態的時間卻是確定的(系統不管妳的按鈕已被按下了多少秒,總之系統就是每50毫秒獲取壹次按鈕狀態),那麽會出現這樣壹種情況:當妳按下按鈕的時間超過100毫秒時,那麽系統認為妳已經按下按鈕已經2次了。壹種直接的解決辦法是將時鐘事件的響應時間從50毫秒改為幾秒,這下按下按鈕短於這個時間的都會認為有效。但我認為這不是壹個有效的解決辦法,因為無法證明時鐘事件響應時間設定為多長是合適的。我想了壹個更為有效的辦法,就是重新定義有效按下:有效按下就是按鈕現在處於彈起狀態,但它的前壹個狀態為按下,具體代碼為:/*!/brief 按鈕狀態枚舉變量,Down為按下狀態,Up為彈起狀態*/enum Status{Down = 0,Up};然後在獲取遊戲桿狀態的對話框類裏定義壹個私有數據成員:Status m_Btn1PreStatus; // 用於保存按鈕的前壹個狀態在對話框類的構造函數初始化m_Btn1PreStatus為彈起狀態:m_Btn1PreStatus = Up;修改變量num遞增100的判斷部分代碼:// 如果當前按鈕被按下而它的前狀態為彈起,則修改它的前狀態為按下if((js.rgbButtons[0] & 0x80)&&( m_Btn1PreStatus==Up)){m_Btn1PreStatus = Down;}//如果當前按鈕的狀態為彈起而它的前狀態為按下,則num遞增,同時修改它的前狀態為彈起else if((js.rgbButtons[0] & 0x80)==0)&&( m_Btn1PreStatus ==Down){num = num +100;這次得到的經驗是獲取硬件狀態必須考慮它的實時性。

  • 上一篇:王小波逝世25周年,他的壹生有多傳奇?
  • 下一篇:小型點焊機價格舉例 廠家信息介紹
  • copyright 2024編程學習大全網