带有if语句滞后的C ++ kbhit

时间:2013-11-14 21:04:16

标签: c++ if-statement kbhit

当我使用带有if语句的kbhit时,我在游戏中有一个奇怪的滞后反应。但是,当我使用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 个答案:

答案 0 :(得分:4)

每次拨打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())

答案 1 :(得分:3)

您的if代码多次调用getch,这不是您想要的。

答案 2 :(得分:2)

这是因为在你的多个if / else if语句中,如果最后一个if语句失败,它将多次调用getch。你可以做的是:

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一次,然后按下字符键进行检查。