#include #include #include #include "term.h" // mvaddstr() の中央揃え版 // h, w:画面の高・幅 // dy:中央から縦方向のシフト // s:文字列(半角文字のみ,日本語等の全角文字は未対応) void CenterStr(int h, int w, int dy, char *s) { mvaddstr(h/2 + dy, (w - strlen(s))/2, s); } // 現在時刻 time(NULL) の実数版 // return:現在時刻の実数値 double Time() { struct timespec ts; // 時刻データの構造体 clock_gettime(CLOCK_REALTIME, &ts); // 現在時刻を取得 // ts.tv_sec: 時刻の整数成分(単位:s;秒) // ts.tv_nsec: 時刻の小数成分(単位:ns;ナノ秒) return (ts.tv_sec + ts.tv_nsec*1.0e-9); // 1 ns = 1.0x10^-9 s // なお,実際にナノ秒単位の精度があるわけではない... // 実数計算の精度の制限から,小数部の下位の数桁は不正確となる. // 多分,ミリ秒程度なら信用できるかな.しらんけど. } // キー入力 getch() の改良版 // (timeout() と getch() と usleep() とが一体化したようなもの) // delay:入力待機時間(ミリ秒) // return:最終入力キー int WaitKey(int delay) { int key = ERR; // 時間内の最終入力キー int tmp; // 現在の入力キー(入力なしも含む) double t; // 時刻 // WaitKey(-1) とかの場合... if (delay < 0) { timeout(-1); // キー入力があるまで待つ return (getch()); // 入力があれば即座に終了 } // 指定された待機時間の間,キーバッファを読み尽くす t = Time() + delay*1.0e-3; // 入力終了予定時刻 timeout(1); do { tmp = getch(); // 現在の入力キー if (tmp != ERR) key = tmp; // 入力ありなら最終入力キーを更新 } while (Time() < t); return (key); // 時間内の最終入力キー } /* * getch() の問題点:(というか,端末のキー入力バッファとかキーリピートの問題点) * ・キーリピート(キー押し続け)の際,バッファに溜まった入力が遅れて処理されるため, *  思い通りに操作できない場合がある. *  (なお,usleep() 等の待ち時間中にも,キー入力がバッファに溜まる.) * ・timeout(delay) だと時間delay(ミリ秒)より早く完了する場合があり, *  ゲームの進行速度が不安定となる. *  (getch() は,入力があれば即座に完了,なければ設定時間だけ待つ.) * ・timeout(0) だと getch() で入力を取得できない場合がある. *  (キーリピート間隔の無入力時間帯には,getch() も入力なしとなってしまう.) */