输入缓冲区中的挂起字符
Pending characters in input buffer
我正在用C++构建一个简单的游戏,我认为我在输入缓冲区方面有很大的问题。下面的代码在一个循环中工作,我正在检查用户是否按下左键或右键来移动我的角色。如果是,我使用switch语句来执行适当的操作。但问题是,当我按下左键一段时间,然后将其更改为右键时,我的角色仍在向左移动一段时间。我想这是因为当我停止按键时,输入缓冲区中仍有字符。我试图通过某种方式清理缓冲区来解决这个问题,但我在互联网上找到的所有东西都不起作用。例如,我试图使用
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运行此程序。问题是,您异步读取keyboerd状态,但管道中可能仍有一些密钥。
使用getch()
读取特殊密钥(microsoft建议使用_getch()
)需要读取两次:
读取功能键或箭头键时,每个功能必须呼叫两次;第一个调用返回0或0xE0,第二个调用返回实际的密钥代码。
当您跳过第一个字符而不检查其有效性时,缓冲输入可能会造成一些破坏。你必须放弃这样的意外输入:
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()
会使您的程序具有特定的窗口。因此,如果您的代码尽管发生了此更改,但仍然不够被动,那么您还可以考虑不使用getch()
,直接使用GetKeyState()
来获得更被动的程序。
if (GetKeyState(VK_RIGHT)!=0) {
// somecode
} else if (...)
...
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 字符串输入超过1000个字符时执行挂起
- 输入缓冲区中的挂起字符