簡體   English   中英

Getch()與Linux C ++中的顯示功能不兼容

[英]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進行輸入和終端輸出,也可以完全使用其他方法。

但是有一個更簡單的解決方案,因為您要做的就是“無需按下回車鍵即可接收用戶輸入”:

  1. 只需將文件描述符0置於非阻塞模式,並使用read()從fd 0進行read() (因為從非阻塞文件描述符讀取std::cin會需要太多保姆)。

請參見fcntl(2)手冊頁,並搜索O_NONBLOCK 然后:

  1. 通過關閉ICANON標志將終端置於非規范模式。 請參見termios(3)手冊頁。 ncurses就是這樣做的,以訪問原始的擊鍵。

如果程序中止,您將需要做一些工作以將終端恢復到規范模式,以便以“理智”的終端模式返回外殼。

簡短:沒有

長:

curses(默認情況下)寫入標准輸出,例如cout 但是使用二合一程序需要您切換I / O模式,並要記住curses和cout的輸出緩沖是不同的

當curses初始化時,它將更改終端的輸入和輸出模式,以允許讀取(輸入)單個字符,並允許其使用單個回車和換行字符(輸出)。 cout假定換行符(換行)引起回車。 當您使用詛咒時,情況並非如此。

當curses初始化時,它將保存終端的輸入和輸出模式的副本,您可以使用curses調用reset_shell_modereset_prog_mode臨時切換到該模式或從該模式切換到該reset_prog_mode 使用這些而不是臨時的termios調用來避免混淆詛咒。

終端模式外,還有輸出緩沖可尋址。 如果您使用的東西寫在標准輸出cout ,切換回之前的詛咒流的沖刷。 從curses切換到cout 刷新 curses以確保屏幕處於已知狀態。

盡管您可以使用newterm為curses指定實際的輸出流(並使它們不同於coutcin ),但仍然必須使用curses接口來可靠地使用庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM