2014-07-10 26 views
0

我正在制作一个类似于太空入侵者的ncurses游戏。如何用ncurses同时打印两件东西

到目前为止,我已经移动并击落了,但是我遇到了一个问题。

当玩家发射激光时,我使用呼叫延迟激光在屏幕上移动,以便它不会从屏幕的一端显示到另一端。

使用usleep延迟激光的问题意味着,当激光在屏幕上行进时,玩家不能四处移动,直到环路退出。

我的问题是,是否有另一种方式来打印激光在屏幕上移动,同时通过用户输入移动播放器/光标?

当用户按下'f'键时,下面的代码在屏幕上移动线条(激光)。但是,用户在激光离开屏幕之后才能再次移动:

void combat(int y, int x) 
{ 
    do 
    { 
     mvprintw(y -1, x, "|"); 
     refresh(); 
     y--; 
     usleep(50000); 
     mvprintw(y , x, " "); 
    } 
    while(y>0); 
} 

回答

0

其实我已经找到了一个体面的解决办法,以我自己的问题,所以在这里我要离开这个万一有人有类似问题在未来。

当我的程序进入战斗功能时,它也进入节点模式,产生一个非阻塞的getch()。随着功能循环休眠,用户可以随时输入角色以使船舶移动,并且由于它处于无延迟模式,如果用户选择保持静止,getch()不会阻止执行睡眠功能。

战斗功能当用户按下 'F',其执行:

void combat(int y, int x) 
{ 
int input; 
int y2 = y; 
int x2 = x; 
do 
{ 
    mvprintw(y2 -1, x2+1, "|"); 
    refresh(); 
    y2--; 
    mvprintw(y2 , x2+1, " "); 
    usleep(50000); 
    nodelay(stdscr, TRUE); 
    input = getch(); 

    switch(input) 
    { 
     case 'w': 
     mvprintw(y, x," "); 
     y--; 
     mvprintw(y, x,"^V^"); 
     break; 

     case 'a': 
     mvprintw(y, x+2," "); 
     x--; 
     mvprintw(y, x,"^V^"); 
     break; 

     case 's': 
     mvprintw(y, x," "); 
     y++; 
     mvprintw(y, x,"^V^"); 
     break; 

     case 'd': 
     mvprintw(y, x," "); 
     x++; 
     mvprintw(y, x,"^V^"); 
     break; 

    } 

} 
while(y2>0); 
movement(y,x); 

}

+0

usleep的组合(50毫秒)和NODELAY是多余的。你可以使用超时(50毫秒) - 循环外 - 并获得相同的效果。另外,usleep不是一个诅咒功能; curses提供了napms。使用睡眠的回应有一个干扰重新绘制屏幕的问题。 –

0

如果没有外部线程,则无法轻松解决此问题。通过将激光器的移动绑定到输入来移除睡眠功能(因此只有当屏幕应该通过外部输入刷新时才更新位置)不起作用,因为您需要激光与其他所有设备相互独立。

一个肮脏的黑客可能有:

  • 非阻塞输入功能,通过int nodelay(WINDOW *win, bool bf)使输入功能不会阻止任何
  • 给定的(足够高)刷新速率,例如10 FPS(睡眠的100毫秒)
  • 更新所述激光位置仅一次,每一个帧的量,将它移动足够缓慢但能够轮询输入足够经常
0

的EA siest的解决办法是用包含一个休眠指令回路,如编写程序:

frame_timer = 0; 
while (1) { 
    if (player_is_alive) { 
    move_player(); 
    move_aliens(); 
    move_laser_bullets(); 
    check_collisions(); 
    } 
    else { 
    draw_explosion(); 
    if (explosion_finished) break; 
    } 
    frame_timer++; 
    usleep(20000); /* Refresh at approximately 50fps */ 
}