Roguelike 系のターンベースのゲームではキー入力を調べる時、入力キューにイベントがなければ入力があるまで待つ、という方法でも問題ないのでそうしてた。しかし Dungeon Crawl の travel コマンドとか途中でキー押してキャンセルする場合には押されてなかったら何もせず帰ってくる必要がある。ということで変更。
X11 の場合 XNextEvent(display, &xev); の代わりに if (XCheckMaskEvent(display, KeyPressMask, &xev)) { ほにゃ; XPutBackEvent(display, &xev); } とする WINDOWSの場合 GetMessage(&msg, NULL, 0, 0); の代わりに if (PeekMessage(&msg, NULL, WM_CHAR, WM_CHAR, PM_NOREMOVE) || PeekMessage(&msg, NULL, WM_KEYDOWN, WM_KEYDOWN, PM_NOREMOVE)) ほにゃ ちなみに ncurses では nodelay(stdscr, TRUE); timeout(0); i = wgetch(stdscr); nodelay(stdscr, FALSE); if (i == -1) i = 0; else ungetch(i); return (i); となってた。