遊戲杆程式設計心得二 如何判斷按鈕的有效按下

2022-04-02 20:23:42 字數 1362 閱讀 8727

在遊戲杆程式設計中通過一般需要獲取按鈕狀態來執行特定事件,比如實現按下按鈕1一次,變數num遞增100,但在除錯系統時往往會出現這種情況:明明按下按鈕一次,但是變數num已經遞增了好幾百。這是怎麼回事呢?開始我有點百思不得其解。但經過檢視程式和思考,我找到了原因。原來程式中我使用了時鐘事件,設定了乙個時鐘,這個時鐘表示系統每50毫秒獲取遊戲杆的按鈕狀態,具體**如下:

settimer( hdlg, 0, 

50, null ); 

同時在ontimer函式裡判斷按鈕按下時我採用了這樣的判斷語句:

表示按鈕1,js.rgbbuttons[0] & 0x80表示按鈕1處於被按下狀態

if( js.rgbbuttons[0] 

&0x80

)  後來我認為這種判斷條件是有問題。問題在**?主要是沒有考慮狀態的實時更新性,為什麼會出現

按下按鈕一次,但是變數num已經遞增了好幾百的情況下?這是因為人按下按鈕的持續時間(即按鈕從被按下到彈起的時間間隔)是不確定,有可能是幾十毫秒或幾秒,但系統獲取按鈕狀態的時間卻是確定的(系統不管你的按鈕已被按下了多少秒,總之系統就是每50毫秒獲取一次按鈕狀態),那麼會出現這樣一種情況:當你按下按鈕的時間超過100毫秒時,那麼系統認為你已經按下按鈕已經2次了。一種直接的解決辦法是將時鐘事件的響應時間從50毫秒改為幾秒,這下按下按鈕短於這個時間的都會認為有效。但我認為這不是乙個有效的解決辦法,因為無法證明時鐘事件響應時間設定為多長是合適的。我想了乙個更為有效的辦法,就是重新定義有效按下:有效按下就是按鈕現在處於彈起狀態,但它的前乙個狀態為按下,具體**為:

/*!    

\brief 按鈕狀態列舉變數,down為按下狀態,up為彈起狀態

*/enum

status

;然後在獲取遊戲杆狀態的對話方塊類裡定義乙個私有資料成員:

status m_btn1prestatus; 

//用於儲存按鈕的前乙個狀態

在對話方塊類的建構函式初始化m_btn1prestatus為彈起狀態:

m_btn1prestatus 

=up;

修改變數num遞增100的判斷部分**:

**//

如果當前按鈕被按下而它的前狀態為彈起,則修改它的前狀態為按下

if((js.rgbbuttons[0] 

&0x80)&&

( m_btn1prestatus

==up))  

//如果當前按鈕的狀態為彈起而它的前狀態為按下,則num遞增,同時修改它的前狀態為彈起

else

if((js.rgbbuttons[0] 

&0x80)==

0)&&( m_btn1prestatus 

==down)

這次得到的經驗是獲取硬體狀態必須考慮它的實時性。

遊戲杆程式設計心得二 如何判斷按鈕的有效按下

在遊戲杆程式設計中通過一般需要獲取按鈕狀態來執行特定事件,比如實現按下按鈕1一次,變數num遞增100,但在除錯系統時往往會出現這種情況 明明按下按鈕一次,但是變數num已經遞增了好幾百。這是怎麼回事呢?開始我有點百思不得其解。但經過檢視程式和思考,我找到了原因。原來程式中我使用了時鐘事件,設定了乙...

Python程式設計學習之如何判斷3個數的大小

前言 大部分初學程式設計的人來說剛開始都會練習判斷兩個數或者三個數的大小,來熟悉某種語言的特性和最基本的if,else迴圈,當我們學習了更高階的語法知識後,又會有不同的實現方式,比如這道練習題依次接收使用者輸入的3個數,排序後列印現在我們來看一下在python中都有哪些方法來實現 1,採用分支結構,...

如何營造遊戲的打擊感(二) 連續打擊

最近開始玩falcom的新作 伊蘇 起源 聯合打擊感一貫不錯的伊蘇系列,勾起了我寫起這篇文章的續作的念頭,這次談的打擊感,主要是從細節 客戶端和伺服器的配合以及數值計算的協調上來談談打擊感中的重要構成部分 連續打擊。連續傷害的爽快感 單機的打擊爽快感素來都是比網遊的爽快感好的,arpg的爽快感素來是...