簡體   English   中英

我如何在 ncurses 中使用 napms()

[英]How can I use napms() in ncurses

我正在嘗試使用 ncurses 庫在 c++ 中創建游戲。 當我用播放器射擊子彈時,我必須使用 napms() function 來繪制子彈運動,但由於 napms() function,播放器無法移動。我該如何解決? 我必須使用線程或者有一個 function 可以幫助我嗎? 謝謝你的關注。

poll() / select()方法很流行,但是——除非你真的需要在同一個循環中檢查非 curses 輸入——我建議你改為研究一種純粹基於 curses 的方法,它圍繞halfdelay()timeout() 您也可以在napms() nodelay()模式下與getch()一起循環使用具有更短延遲的 napms() 。 例如,如果您想每半秒更新一次子彈,那么您可以調用napms(50)十次而不是調用napms(500) —— 每次之后檢查輸入,允許玩家響應 —— 並且只有這樣才能更新項目符號。

(我的偏見是:如果你堅持使用 curses 調用,你的程序將很容易移植到其他實現,如 PDCurses,如果你 go poll() / select()路由就不會。)

簡短的回答:您不將napms與 ncurses 一起使用。 您使用無延遲模式和poll() 首先使用nodelay()將 ncurses 置於無延遲模式(有關更多信息,請參閱ncurses文檔)。

如果你閱讀getch()手冊頁,你會發現它解釋了如何在無延遲模式下getch從不阻塞,但如果沒有按下任何鍵則立即返回ERR

此時,您可以使用poll()select()來等待按下某個鍵,並設置明確的超時時間。 那是您的延遲(以毫秒為單位)。 您將不得不添加一些邏輯來確定應該做什么。

你的整體邏輯應該是這樣的:

  1. 調用getch

  2. 如果getch返回一個密鑰,請用它做任何你想做的事,然后 go 到第 1 步。

  3. 僅當getch返回 ERR: 計算現在是否是時候執行您的程序需要執行的任何其他操作,例如繪制子彈。 自上次拔出子彈以來,您完全有可能已經等待了規定的毫秒數。 然后 go 到第 1 步。

  4. 僅當您的程序得出尚未到繪制子彈的結論時,才計算在步驟 3 中需要完成某事之前需要等待的時間。

  5. 在規定的時間間隔內執行poll()select() 然后 go 回到步驟 1。

因此,例如,當您從頭開始時, getch給您 bupkis,然后您決定剛剛拔出子彈,並且需要在 100 毫秒內再次拔出子彈。 poll() ,醒來后你從getch得到了一些東西,然后你就可以處理它。 然后,每當你回到第 5 步時,你確定子彈是在 75 毫秒前繪制的( poll()返回,因為現在有東西要getch -ed,它沒有超時,並且在處理一個鍵后你查詢掛鍾並看到它現在是 75 毫秒后)所以你現在poll()多了 25 毫秒。

暫無
暫無

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

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