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

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

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

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 лучше, так как он выглядит чище.

3 ответа

Решение

Каждый раз, когда вы звоните 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()),

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

Это потому, что в вашем множественном выражении 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 Один раз, затем нажмите клавишу с символом.

Другие вопросы по тегам