2017-03-06 52 views
0

我正在爲roguelike遊戲編寫代碼,並且這部分代碼使用getch()來接受用戶輸入以指導角色接下來的移動方向。我的理解是,getch()會暫停程序,直到它接收到用戶的輸入,但是我的代碼在到達該行時不會暫停。下面是代碼程序不會在getch中暫停()

uint32_t pc_next_pos(dungeon *d) 
    { 
    char comm; 
    comm = getch(); 
    command_move(d, comm); 
    } 

整個程序編譯正確,它只是代替暫停程序,讓我感動我的性格,它繼續走,直到程序終止,一旦在比賽中模具的所有怪物。該代碼不包含在內,因爲它在此方法中不起作用。

我在這個方法做錯了,不允許getch()暫停程序,或者我誤解了getch()做了什麼?

+1

您有2個getch()實例。你指的是哪個實例? –

+0

我的歉意,我調整了代碼。第二個getch()是爲了通信 – Zebs

+0

請檢查答案和評論在這裏:http://stackoverflow.com/questions/12060572/getch-does-not-pause-the-loop – scorpGoku

回答

1

getch()可以阻斷或非阻塞(或甚至與一個超時阻塞),這取決於輸入選項。你想阻止;你得到了非阻塞。問題不在這裏,在這個函數中,但在你的curses初始化代碼的某個地方(沒有顯示) - 你可能會調用類似於nodelay(stdscr, TRUE)或,在initscr()之後不久。如果沒有,您可能需要添加諸如nodelay(stdscr, FALSE)之類的東西,儘管這應該是默認行爲。

你也應該halfdelay()cbreak()(通常是同一個人頁面nodelay()timeout()上)讀了。

+0

我感覺很傻。問題出現是因爲我出於某種原因實際上註釋了initscr()。感謝你的回答,我回頭看了看那是個問題。現在一切正常。謝謝! – Zebs

0

您可以更改getch功能行爲調用timeout

爲人3超時:

超時wtimeout程序設置阻斷和非阻塞閱讀給定的窗口。 如果延遲爲負,則使用阻塞讀取(即,無限期等待輸入)。如果延遲爲零,則使用非阻塞讀取(即,如果沒有輸入等待,則讀取返回ERR)。如果延遲爲正值,則讀取塊的延遲毫秒數,如果仍然沒有輸入,則返回ERR。因此,這些例程提供了與nodelay相同的功能,再加上只能延遲幾毫秒(延遲爲正數)的阻塞功能。

uint32_t pc_next_pos(dungeon *d) 
    { 
    char comm; 
    /* set getch blocking */ 
    timeout(-1); 
    comm = getch(); 
    command_move(d, comm); 
    return .... 
    } 
+0

這也將編譯(作爲OP的確),但沒有回答這個問題。 –