2010-10-28 25 views
2

我正在写一个小型控制台冒险游戏,我遇到了一些问题。
1.输入有点迟缓,我使用while循环(while(getch()=='w'))。第一次按下某个键后,没有任何事情发生(必须按两下),并且如果您切换方向(按A/D/S键),它也不会在第一次响应。如果你拿着钥匙,它可以正常工作。这怎么解决?
2.这是我用来刷新游戏的功能(当按下一个键渲染游戏场景):C++控制台游戏输入&&刷新功能

void refresh(char map[Y][X]) 
{ 
    system("cls"); 
    for (int i = 0; i<UP; i++) 
    { 
     cout<<endl; 
    } 
    for (int i = 0; i<Y; i++) 
    { 
     for (int k = 0; k<LEFT; k++) 
     { 
      cout<<" "; 
     } 
     for (int j = 0; j<X; j++) 
     { 
      cout<<map[i][j]; 
     } 
     cout<<endl; 
    } 
} 

当我使用这个函数一次,它的确定,但是当他们键被按下或持有多时间 - 游戏场开始闪烁。我认为我只需要重绘一部分场地(进行改变/移动的场地),而不是整个场地。你能提供任何想法如何做到这一点?

输入的示例代码:

while(getch() == 'w') 
    { 
     if (map[y-1][x]!= WALL) 
     { 
     map[y-1][x] = CHARACTER; 
     map [y][x] = ' '; 
     y--; 
     refresh(map); 
     Sleep(SPEED); // this is unnecessary, SPEED is 0, I just kept it for tests 
     } 
    } 

基本上,主要功能如下:

int main() 
{ 
    (...) Variables (...) 
    generateMap(FROM FILE); 
    refresh(); // First initialization of the field 
    while (getch() != 'q') // While not quitting 
    { 
    while(getch() == 'w') 
    { 
     if (THE FIELD ABOVE IS NOT OCCUPIED) 
     { 
      setSomeVariables(); 
      refresh(THE GAMEFIELD); 
     } 
    } 
    } 
    while(getch() == 's') 
    { 
     if (THE FIELD BELOW IS NOT OCCUPIED) 
     { 
      setSomeVariables(); 
      refresh(THE GAMEFIELD); 
     } 
    } 
    } 
    while(getch() == 'a') 
    { 
     if (THE FIELD ON THE LEFT IS NOT OCCUPIED) 
     { 
      setSomeVariables(); 
      refresh(THE GAMEFIELD); 
     } 
    } 
    } 
    while(getch() == 'd') 
    { 
     if (THE FIELD ON THE RIGHT IS NOT OCCUPIED) 
     { 
      setSomeVariables(); 
      refresh(THE GAMEFIELD); 
     } 
    } 
    } 
    return 0; 
} 
+0

'getch()'第一次返回的值是多少? – Vlad 2010-10-28 09:10:14

+0

第一次它不返回任何东西(循环不运行),我已经添加了上面的代码。 – Winis 2010-10-28 12:12:23

回答

3

不要使用system("cls"),它实在是太慢了,而是设置在屏幕的开头用下面的代码光标:

COORD cur = {0, 0}; 
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cur); 

你应该叫getch()只有一次在环,像这样:

char key; 

do 
{ 
    key = getch(); 

    if(key == 'w') 
    { 
     //do something 
    } 

    //the other if statements 

}while(key != 'q'); 
+0

这些功能来自哪个库? – luqui 2010-10-28 11:57:55

+0

@luqui Windows SDK – Dialecticus 2010-10-28 12:02:04

+0

你必须包含windows.h – Flagbug 2010-10-28 12:04:43

2
  1. 代码应该只具有一个的getch()在整个代码(如果可能的话),并在交换机内部为每个输入执行操作。所以,它是在循环内切换的,而不是在开关内部循环。是这样的:

    而((CH =的getch())= 'Q'!) { 开关(CH) { 壳体 'A': GoLeft(); 休息; ... }}

  2. 有一个名为ncurses,你可以用它来移动光标在屏幕上,并在任何地方写东西的库。

+0

1.我已经添加了代码。 2.谢谢,如果没有其他选择,我会使用ncurses,但我想坚持默认库。 – Winis 2010-10-28 12:08:17

+0

没有用于显示绘图的默认库,因为在某些硬件中可能根本没有显示。我认为这不是完整的相关代码。代码中有多个getch吗? – Dialecticus 2010-10-28 12:18:49

+0

是的,我有5个(W,A,S,D代表控件,Q代表退出)。 我应该粘贴整个代码吗?大多数变量都不是英文的,所以理解其中的一些可能会很复杂。 – Winis 2010-10-28 12:42:27

1

它看起来像你的问题是多次调用getch()。只有一个循环,每循环调用一次getch(),并存储结果。对每个循环的迭代测试每个值(q,w,s,...)的结果。

+0

谢谢!你和flagbug的解决方案工作,如果可能的话,我会接受这两个答案。 – Winis 2010-10-28 14:59:32

+0

你仍然可以upvote;) – luke 2010-10-28 15:52:32

+0

我不能 - 它需要15声望:/ – Winis 2010-10-28 18:58:25