我正在用C ++编写游戏,我需要检测用户何时按下某个键。通常,我会使用std::cin
,但我有一个图形窗口,使用graphics.h
,这是一个最初由古老的Borland Turbo C ++编译器提供的标题,但在线提供了相应的标题。所以,我会使用函数inportb();
,函数定义如下:
inline unsigned char inportb(unsigned int port) {
unsigned char ret;
asm volatile ("inb %%dx,%%al":"=a"(ret):"d"(port));
return ret;
}
来源:inportb。
但在Windows中,像这样的直接低级硬件I / O受到保护,如果尝试,则该程序将被终止。所以我需要通过高级函数或API来访问该函数。
我的问题:我该怎么做?
答案 0 :(得分:6)
如果您试图在游戏循环中间检测特定键的状态,GetAsyncKeyState将确定当时的特定状态。
if (GetAsyncKeyState(VK_LEFT) & 0x8000) != 0u)
{
// ...
}
此函数采用virtual key代码(在本例中为左箭头键),获取状态,并在按位AND操作后确定密钥是否已关闭,然后关闭。
这些virtual key代码可以在WinUser.h中找到。 GetAsyncKeyState与GetKeyState的不同之处在于GetKeyState不反映与硬件相关的中断级状态(这就是我上面使用GetAsyncKeyState的原因)。如果您需要给定实例的所有关键状态(很少见),请考虑GetKeybardState。
但是,如果您要等待关键事件(WM_KEYDOWN,WM_CHAR,WM_KEYUP),则必须在window procedure中提供一个案例来处理事件
LRESULT WindowProc(UINT const message, WPARAM const wparam, LPARAM const lparam)
{
switch(message)
{
// [ cases like WM_CREATE / WM_PAINT / WM_CLOSE / WM_DESTROY ]
case WM_KEYDOWN:
// handle event here
break;
case WM_CHAR:
// handle event here
break;
case WM_KEYUP:
// handle event here
break;
}
}
希望这有帮助。
答案 1 :(得分:2)
在Windows中有4种不同的方法可以检测输入。
答案 2 :(得分:1)
几十年前我对Turbo C ++很开心:-)但如果我是你,我会尝试使用除C编译器之外的游戏引擎或lib,例如此SDL或Ogre(请参阅{ {3}}对于太长的清单而言。)
它们提供(除其他外)具有键盘事件的事件循环。
或者更少,您可能希望使用Windows或跨平台框架,例如Microsoft提供的MSVC(可以免费使用)或Qt(更加免费,现在附带一个方便的IDE)
玩得开心,给别人带来乐趣!