0

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

4

3 回答 3

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())

于 2013-11-14T21:09:30.463 回答
3

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

于 2013-11-14T21:06:40.083 回答
2

getch这是因为在您的多个 if/else if 语句中,如果最后一个 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一次,然后检查是否按下了字符键。

于 2013-11-14T21:08:20.640 回答