2015-12-09 56 views
1

我很難與GLFW的輸入系統聯繫,弄清楚如何使它按照我想要的方式工作,所以我已經找到了有更多智慧經驗的人。使用GLFW 3.GLFW輸入狀態

有3個狀態0釋放,1按和2重複。這正是我想要的,只是,從按下到重複的關鍵狀態需要一秒左右才能更改。理想情況下,我希望它只有一幀「按」狀態,然後變成重複狀態。

目標:能夠方便地調用基於我的關鍵是什麼狀態的功能如下:

  • 按點擊(做一次)

  • 重複連拍(做的每一幀)

  • 發行不響應

LINK

請查看以上鍊接中的文件,並讓我知道是否有其他解決方法。或者,這種方法本身就是垃圾,我這樣做?感謝球員,所有反饋和幫助appreiated。

+0

做一些「一幀」並不是一個非常具體的時間值,因爲幀速率可能會有所不同(除非您使用固定的幀速率)。但即使你使用固定的幀速率,那麼如果它是60 FPS,一幀如果只有1/60秒,對於任何人來說真正能夠做出反應的時間很少,用戶認爲只是一個鍵在用戶有機會釋放密鑰之前,按可能被解釋爲多個。如果您有一個單位數的幀速率,這將是可用的唯一方法。 –

+0

我想要做的是讓函數只運行一次邏輯記號,儘管我長時間保持按鍵不變。所以,如果按下空格鍵,只能打印一次。不要再重複它。 – GDN9

+0

啊,這樣更有意義!然後我的答案應該工作得很好。 –

回答

3

「按」與「重複」之間存在延遲是非常重要的。大多數人不能按下和釋放一個鍵,這樣你的遊戲只記錄被按下的鍵正好一幀。而那些有能力的人不可能一貫這麼做,並且沒有任何準確性。

因此,用戶將永遠無法「做一次」。他們會爲多個幀做它。這通常很糟糕。

此外,按下,按住和重複之間有一個概念上的區別。握住就是按住鍵時發生的事情。重複是由操作系統管理的設施(這就是爲什麼GLFW不給你設置重複速率的方法)。關鍵重複通常用於文本輸入(無論如何GLFW都會通過其基於文本的回調來幫您處理)。

本質上,你應該忽略它。在遊戲的情況下,一個按鍵有4種可能的有用狀態:沒有按下,剛被按下,被按住,剛剛被釋放。您可以從按鈕的先前狀態(您可以存儲的)和回調提供的按鈕的當前狀態中推斷出這一點。

如果您只想在按鈕「剛剛按下」時採取行動,那麼您需要知道該按鈕沒有在前一幀中按下。如果現在按鍵但不在前一幀中,請採取措施。

+0

只需要檢查lastState和newState ..哇,很好的答案我不能相信這是非常正確的在我面前哈哈!好一個! – GDN9

3

一種方法是簡單地忽略「重複」事件,並且只與「新聞」和「發佈」事件一起進行。

當你得到「新聞」事件設置一個標誌,並清除「釋放」事件的標誌。然後只需每幀檢查一次這個標誌。