2010-02-26 85 views
3

我有點寫一個小遊戲引擎 - 純粹是爲了理解這些內部工作是如何實現的。我目前不想混淆OpenGL或DirectX,所以我堅持使用GDI +和WinForms的所有東西進行控制。兩次連續的KeyDown事件之間的延時延遲

顯然,我需要處理輸入。更具體地說,鍵盤事件。然而,這帶來了一個問題:

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    Trace.WriteLine(string.Format("KD {0:hh:MM:ss.fff} {1}", 
     DateTime.Now, e.KeyCode)); 
} 

此代碼(即使在鍵盤小程序的控制面板中設置最短的重複延時)yeilds如下:

KD 10:02:18.318 Right 
KD 10:02:18.570 Right 
KD 10:02:18.598 Right 
KD 10:02:18.639 Right 
KD 10:02:18.667 Right 
KD 10:02:18.701 Right 

正如你所看到的,有0.25秒。前兩個事件之間的延遲。這導致屏幕上的物體運動緩慢,顯然:它首先稍微向右移動,然後暫停一個明顯的時刻,然後繼續。

我該如何解決該問題?這可以在純WinForms中完成嗎?或者我應該使用DirectInput(或者現在的其他什麼是Kosher方式?)路由?

+0

這很噁心這個問題在Google搜索結果中出現的速度有多快。 – 2010-02-26 08:28:43

回答

3

使用Windows消息不是進行輸入交互的最佳方式。
我對WinForms一無所知,但我假設在關鍵事件中使用消息。

我很多年前就使用過DirectInput(v7),而且速度非常快。
也許GetKeyboardStateGetAsyncKeyState在遊戲循環中是很好的選擇。

+0

哇!這是更快! – 2010-02-26 08:22:35

+0

@安頓,哪一個? GetKeyboardState或GetAsyncKeyState? – 2010-02-26 08:32:14

+0

'GetKeyboardState'結果足夠快,所以我從來沒有嘗試'GetAsyncKeyState'。 – 2010-02-26 08:35:30