[英]Getch() incompatible with display function in linux c++
我正在為一個班級制作2D地牢爬蟲類游戲。 我正在嘗試接收用戶輸入,而不需要按下Enter鍵。 具體來說,我想使用wasd作為方向鍵在2D數組中移動。
我試過使用ncurses庫,但當前它與我的顯示功能混淆了(我相信在使用endl時)。
通常我顯示的板看起來像:
xxx
xxx
xxx
但是,當使用ncurses庫中的getch()時,我的面板看起來像:
xxx
...... xxx
............ xxx
有沒有辦法使用curses庫中的getch()而不干擾我的打印功能?
void ParkBoard::print() {
displayMessage();
for (int i = 0; i < getSize(); i++) {
cout << " ";
for (int j = 0; j < getSize(); j++) {
if (j == 0) {
parkBoard[i][j]->display();
}
else {
cout << " ";
parkBoard[i][j]->display();
}
}
cout << endl;
}
ncurses希望它可以完全控制顯示終端。 您正在使用ncurses進行輸入,但仍將輸出噴出到std::cout
。
這是行不通的。 至少並非沒有重大黑客攻擊。
ncurses是一項全有或全無的交易。 您可以使用ncurses進行輸入和終端輸出,也可以完全使用其他方法。
但是有一個更簡單的解決方案,因為您要做的就是“無需按下回車鍵即可接收用戶輸入”:
read()
從fd 0進行read()
(因為從非阻塞文件描述符讀取std::cin
會需要太多保姆)。 請參見fcntl(2)手冊頁,並搜索O_NONBLOCK
。 然后:
ICANON
標志將終端置於非規范模式。 請參見termios(3)手冊頁。 ncurses就是這樣做的,以訪問原始的擊鍵。 如果程序中止,您將需要做一些工作以將終端恢復到規范模式,以便以“理智”的終端模式返回外殼。
簡短:沒有
長:
curses(默認情況下)寫入標准輸出,例如cout
。 但是使用二合一程序需要您切換I / O模式,並要記住curses和cout
的輸出緩沖是不同的 。
當curses初始化時,它將更改終端的輸入和輸出模式,以允許讀取(輸入)單個字符,並允許其使用單個回車和換行字符(輸出)。 cout
假定換行符(換行)引起回車。 當您使用詛咒時,情況並非如此。
當curses初始化時,它將保存終端的輸入和輸出模式的副本,您可以使用curses調用reset_shell_mode
和reset_prog_mode
臨時切換到該模式或從該模式切換到該reset_prog_mode
。 使用這些而不是臨時的termios調用來避免混淆詛咒。
除終端模式外,還有輸出緩沖可尋址。 如果您使用的東西寫在標准輸出cout
,切換回之前的詛咒做流的沖刷。 從curses切換到cout
, 請 刷新 curses以確保屏幕處於已知狀態。
盡管您可以使用newterm
為curses指定實際的輸出流(並使它們不同於cout
和cin
),但仍然必須使用curses接口來可靠地使用庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.