C++ kbhit 与 if 语句滞后

C++ kbhit with if statement lag

本文关键字:语句 滞后 if kbhit C++      更新时间:2023-10-16

当我使用 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;}
    }
}

不会导致延迟的 switch 语句

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 语句,因为它看起来更干净。

每次调用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 语句中,如果最后一个 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一次,然后按字符键进行检查。