输入缓冲区中的未决字符
Pending characters in input buffer
我正在用 C++ 构建一个简单的游戏,我认为输入缓冲区存在很大问题。下面的代码循环运行,我正在检查用户是按下左键还是右键来移动我的角色。如果是这样,我使用 switch 语句来执行适当的操作。但问题是,当我按下左键一段时间然后将其更改为右键时,我的角色仍然向左移动了一段时间。我认为这是因为当我停止按键时输入缓冲区中仍有字符。我试图通过某种方式清理缓冲区来解决这个问题,但我在 Internet 上找到的所有内容都不起作用。例如,我试图使用
FlushConsoleInputBuffer(stdin);
或
std::cin.clear();
std::cin.sync();
这一切都失败了,因为我用错了它,或者它根本不适合我的目的。你能帮我解决我的问题吗?
我的代码:
if(GetAsyncKeyState(VK_RIGHT)!= 0 || GetAsyncKeyState(VK_LEFT) != 0){
getch();
int key = getch();
switch(key){
case KEY_LEFT:
//some code
break;
case KEY_RIGHT:
//some code
break;
case KEY_F1:
//some code
break;
default:
break;
}
}
我假设你是 运行 这个 windows。问题是您异步读取键盘状态,但管道中可能仍有一些键。
使用getch()
读取特殊键(微软推荐使用_getch()
)需要读取两次:
When reading a function key or an arrow key, each function must be
called twice; the first call returns 0 or 0xE0, and the second call
returns the actual key code.
当您跳过第一个字符而不检查其有效性时,缓冲输入可能会造成一些破坏。您必须丢弃此类意外输入:
if (...) {
int key;
do key0 = _getch();
while (key != 0 && key != 0xE0); // make sure we read special keys only.
key = _getch();
switch(...) { // don't forget default as key could still be unexpected special key
}
}
但是使用 GetAsyncKeyState()
会使您的程序已经 windows 具体。因此,如果尽管进行了此更改,您的代码仍然不够反应,那么您也可以考虑不使用 getch()
并通过直接使用 GetKeyState()
来获得更具反应性的程序。
if (GetKeyState(VK_RIGHT)!=0) {
// somecode
} else if (...)
...
我正在用 C++ 构建一个简单的游戏,我认为输入缓冲区存在很大问题。下面的代码循环运行,我正在检查用户是按下左键还是右键来移动我的角色。如果是这样,我使用 switch 语句来执行适当的操作。但问题是,当我按下左键一段时间然后将其更改为右键时,我的角色仍然向左移动了一段时间。我认为这是因为当我停止按键时输入缓冲区中仍有字符。我试图通过某种方式清理缓冲区来解决这个问题,但我在 Internet 上找到的所有内容都不起作用。例如,我试图使用
FlushConsoleInputBuffer(stdin);
或
std::cin.clear();
std::cin.sync();
这一切都失败了,因为我用错了它,或者它根本不适合我的目的。你能帮我解决我的问题吗?
我的代码:
if(GetAsyncKeyState(VK_RIGHT)!= 0 || GetAsyncKeyState(VK_LEFT) != 0){
getch();
int key = getch();
switch(key){
case KEY_LEFT:
//some code
break;
case KEY_RIGHT:
//some code
break;
case KEY_F1:
//some code
break;
default:
break;
}
}
我假设你是 运行 这个 windows。问题是您异步读取键盘状态,但管道中可能仍有一些键。
使用getch()
读取特殊键(微软推荐使用_getch()
)需要读取两次:
When reading a function key or an arrow key, each function must be called twice; the first call returns 0 or 0xE0, and the second call returns the actual key code.
当您跳过第一个字符而不检查其有效性时,缓冲输入可能会造成一些破坏。您必须丢弃此类意外输入:
if (...) {
int key;
do key0 = _getch();
while (key != 0 && key != 0xE0); // make sure we read special keys only.
key = _getch();
switch(...) { // don't forget default as key could still be unexpected special key
}
}
但是使用 GetAsyncKeyState()
会使您的程序已经 windows 具体。因此,如果尽管进行了此更改,您的代码仍然不够反应,那么您也可以考虑不使用 getch()
并通过直接使用 GetKeyState()
来获得更具反应性的程序。
if (GetKeyState(VK_RIGHT)!=0) {
// somecode
} else if (...)
...