C ++ кбит с оператором if

У меня странная реакция на запаздывание в игре, которую я делаю, когда использую kbhit с операторами if. Однако я не вижу такой же проблемы с запаздыванием, когда я использую оператор switch. Вот и мои коды в IF и переключатель.

Приведенный ниже код вызывает задержку, когда я пытаюсь переместить персонажа, мне придется дважды нажать кнопку, чтобы персонаж переместился.

void PlayerBike()
{
if (kbhit())
{
if ((getch()) == 'w'){PlayerX = PlayerX - 1;}
else if ((getch()) == 's'){PlayerX = PlayerX +1;}
else if ((getch()) == 'd'){PlayerY = PlayerY +1;}
else if ((getch()) == 'a'){PlayerY = PlayerY - 1;}
}
}

Переключатель оператора, который не вызывает задержки

if (kbhit())
{
switch (getch())
{
case 'w':
PlayerX = PlayerX - 1;
break;

case 's':
PlayerX = PlayerX + 1;
break;

case 'd':
PlayerY = PlayerY + 1;
break;

case 'a':
PlayerY = PlayerY - 1;
break;
}
}

Я хотел бы использовать оператор if лучше, так как он выглядит чище.

0

Решение

Каждый раз, когда вы звоните getch, вы ждете символа ввода от пользователя. Если вы хотите двигаться влево, вам на самом деле придется нажать клавишу четыре раза.

Исправить просто — только звонок getch() один раз:

if (kbhit()) {
char keystroke = getch();
if (keystroke == 'w'){PlayerX = PlayerX - 1;}
else if (keystroke == 's'){PlayerX = PlayerX +1;}
else if (keystroke == 'd'){PlayerY = PlayerY +1;}
else if (keystroke == 'a'){PlayerY = PlayerY - 1;}
}

Кстати, у вас была дополнительная пара скобок вокруг каждого вызова getch (). Все, что тебе нужно getch()не (getch()),

4

Другие решения

Ваш if кодовые звонки getch не раз, что не то, что вы хотите.

3

Это потому, что в вашем множественном выражении if / else if это вызовет getch более одного раза, если последний оператор if не удался. Вместо этого вы можете сделать следующее:

if(kbhit())
{
char chInput = getch();

if (chInput == 'w'){PlayerX = PlayerX - 1;}
else if (chInput == 's'){PlayerX = PlayerX +1;}
else if (chInput == 'd'){PlayerY = PlayerY +1;}
else if (chInput == 'a'){PlayerY = PlayerY - 1;}
}

Это будет только позвонить getch Один раз, затем нажмите клавишу с символом.

2
По вопросам рекламы [email protected]