gpt4 book ai didi

c++ - 为什么我在使用 ReadConsoleInput 时收到每个键盘事件两次?

转载 作者:太空狗 更新时间:2023-10-29 23:04:31 29 4
gpt4 key购买 nike

好吧,为了开始这个话题,我想说我对编码还比较陌生。话虽这么说,如果问题太模糊而无法理解,我深表歉意。

以下代码来 self 为 Win32 制作的第一个真正的 C++ 程序。 playerMove 函数将玩家图标移动到屏幕上的新位置,同时用 X 替换旧位置。

我不确定为什么,但每当我按下任何键引起运动时,它都会执行两次 Action 。我不确定我读取输入缓冲区的方式是什么还是什么,但我想知道我是否错过了一个简单的解释。我在每个案例的末尾都包含了 FlushConsoleInputBuffer 以防出现问题,但这似乎并没有解决问题。

void playerMove()
{

HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
DWORD NumInputs = 0;
DWORD InputsRead = 0;
bool running = true;

INPUT_RECORD irInput;

GetNumberOfConsoleInputEvents(hInput, &NumInputs);

while(running)
{
ReadConsoleInput(hInput, &irInput, 1, &InputsRead);
//std::cout << irInput.Event.KeyEvent.wVirtualKeyCode << std::endl;

HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
COORD coordDest;

switch(irInput.Event.KeyEvent.wVirtualKeyCode)
{
case M_KEY:
FlushConsoleInputBuffer(hInput);
displayMenu();
//Opens the menu
break;

case VK_LEFT:

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.X=(xcoord-1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
xcoord--;
FlushConsoleInputBuffer(hInput);
// move it left
break;

case VK_UP:

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.Y=(ycoord-1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
ycoord--;
FlushConsoleInputBuffer(hInput);
// move it up
break;
case VK_RIGHT:

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.X=(xcoord+1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
xcoord++;
FlushConsoleInputBuffer(hInput);
// move it right
break;

case VK_DOWN:

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.Y=(ycoord+1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
ycoord++;
FlushConsoleInputBuffer(hInput);
// move it down
break;

}

}
}

最佳答案

通过在 switch 语句之前添加一个 if 语句来检查一个键是否被按下 (bKeyDown),它只会在键被按下时通过首先检查一个键是否被按下来捕获该键。所以这个问题可以认为已经回答了。

关于c++ - 为什么我在使用 ReadConsoleInput 时收到每个键盘事件两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22675708/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com