Итак, для начала я хочу сказать, что я относительно новичок в программировании. При этом я прошу прощения, если вопрос слишком неопределенный, чтобы понять.
Следующий код взят из моей первой настоящей программы на С ++, которую я делаю для Win32. Функция playerMove
перемещает значок игроков в новое место на экране, заменяя старое место знаком X.
Я не уверен, почему, но всякий раз, когда я нажимаю любую из клавиш, чтобы вызвать движение, он выполняет действие дважды. Я не уверен, является ли способ, которым я читаю входной буфер или что, но мне было интересно, было ли простое объяснение, которое я просто пропустил. Я включил 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;
}
}
}
Добавляя оператор if, чтобы проверить, нажата ли клавиша (bKeyDown) перед оператором switch, он ловит только клавишу при нажатии, сначала проверяя, нажата ли клавиша. Так что этот вопрос можно считать ответом.
Других решений пока нет …