3

我正在尝试编写一个使用两个线程的简单游戏,一个线程用于获取用户的输入,另一个线程用于为某些场景设置动画。我可以在不按 ENTER 的情况下获得字符,但它会在动画线程中阻塞,直到用户按下一个键。有谁知道从键盘非阻塞获取字符的方法?

4

2 回答 2

1

如果您要检查少数特定键,GetAsyncKeyState()可用于轮询状态。否则,您应该实现消息循环并WM_CHAR在应用程序中处理消息。

如果您的环境尚不支持所需的 win32 函数,则可以使用类似于以下内容的库访问原始 win32 函数。

RAA - win32-api @ raa.ruby-lang.org

以下是 的相关链接GetAsyncKeyState()

GetAsyncKeyState() @ MSDN
Virtual-Key Codes @ MSDN(用作 GetAsyncKeyState 和其他函数的值)

如果您决定使用消息循环,则需要在托管应用程序窗口的同一线程上实现它。这里有一个简短的解释:

Microsoft Windows @ Wikipedia 中的消息循环

如该链接所示,消息循环并不多。您的框架可能已经在后台运行了一个来托管包含您的图形的窗口。如果是这种情况,您不需要第二个线程进行输入;但是您需要拦截和处理该主机窗口的 Windows 消息。

如果您必须自己实现消息循环,您可以使用 wikipedia 链接上的骨架。该DispatchMessage调用会将窗口消息定向到适当的窗口处理程序。您将需要在 ruby​​ 框架中为 Windows 消息寻找匹配的存根或处理程序,并WM_CHAR从那里处理。

DispatchMessage @ MSDN
WM_CHAR @ MSDN

如果您想知道何时按下/按下键,那么您将需要处理 WM_KEYUP 和 WM_KEYDOWN 消息。

WM_KEYUP @ MSDN
WM_KEYDOWN @ MSDN

还要注意,GetAsyncKeyState()即使另一个应用程序在前台,也可以调用并返回键状态。处理WM_ACTIVATEWM_SETFOCUS/WM_KILLFOCUS消息,以便您的应用程序在另一个窗口处于活动状态时忽略或推迟检查,如果您只关心键状态而您的窗口是主要前景窗口。

WM_ACTIVATE @ MSDN
WM_SETFOCUS @ MSDN
WM_KILLFOCUS @ MSDN

于 2010-04-22T10:48:00.193 回答
0

我为此使用了rubygame。它使您能够以最少的代码将函数附加到键盘事件。 RubySDLGoSu将为您提供类似的功能。

如果您不想使用与游戏相关的 gem 走这条路,请查看如何检查 IO 对象中是否有数据可用。这可以用来轮询键盘。

于 2010-04-22T09:01:49.690 回答