当我使用带有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语句,因为它看起来更干净。
答案 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
一次,然后按下字符键进行检查。