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);
となってた。