2013-11-14 17 views
0

我在使用kbhit和if语句时所做的游戏中有一个奇怪的滞后反应。但是,当我使用switch语句时,我看不到这个相同的滞后问题。这里是我的代码在IF和开关。带if语句的C++ kbhit滞后

下面的代码导致滞后,当我尝试移动角色时,为了角色移动,我必须按两次按钮。导致没有滞后

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; 
    } 
} 

我想用

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语句更好,因为它只是看起来更清洁。

回答

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

3

您的if代码多次呼叫getch,这不是您想要的。

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