2014-07-10 56 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 */ 
}