3

我在写一个小游戏引擎——纯粹是为了了解这些引擎是如何从内部工作的。我目前不想弄乱 OpenGL 或 DirectX,所以我坚持使用 GDI+ 和所有 WinForms 的东西在控件上绘图。

显然,我需要处理输入。更具体地说,键盘事件。然而,这带来了一个问题:

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

这段代码(即使在控制面板的键盘小程序中设置了最短的重复延迟)会产生以下结果:

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(或者现在的犹太洁食方式?)路线?

4

1 回答 1

3

使用 Windows 消息并不是进行输入交互的最佳方式。
我对 WinForms 一无所知,但我假设关键事件使用消息。

多年前我使用过 DirectInput (v7),而且速度非常快。
也许游戏循环中的GetKeyboardStateGetAsyncKeyState是不错的选择。

于 2010-02-26T08:06:44.167 回答