基本的な考え方は、tmさんのプログラムで良いと思いますよ。
あとはプログラムの全体図としてどう描くか、ということなのだと思いますが…
まず、スマートに組むためにはクラスを活用することをお勧めします。
で、処理はクラスの中に全部突っ込んで、メインプログラムからはフレームに1回呼び出せば良いようにします。
あまりサンプルとして良くないかもしれませんが、私自身の例を載せてみますね。
(大分前に作ったのがそのままなので、作法的に変な部分もあると思います)
//------------------------------------------------------------------------------
// ボタンのテンプレート
//------------------------------------------------------------------------------
class csButton{
public:
void Check(int state, int curx, int cury, int prevx, int prevy); // 状態チェック
int DownFlag, UpFlag, ClickFlag; // 各フラグ
POS Down, Up, Click; // イベントが起きた座標
int State[MAXINPUTLOG]; // 状態のログ
int MovedValueFromDown; // Downしてから移動した距離
};
//------------------------------------------------------------------------------
// 管理クラス
//------------------------------------------------------------------------------
class csInput{
public:
void Check();
// 入力バッファ
int MouseBuf;
int JoypadBuf[USEPADNUM];
char KeyBuf[256];
// マウス
class csMouse{
public:
int InputData;
int X[MAXINPUTLOG];
int Y[MAXINPUTLOG];
csButton Left, Right;
} Mouse;
// ゲームパッド
class csJoypad{
public:
int InputData;
csButton Up, Down, Left, Right;
csButton Btn[16];
} Joypad[4];
// キーボード
class csKeyBoard{
public:
int InputData;
csButton Key[256];
} KeyBoard;
};
内容的には
・Input.Check()をフレームに1回呼び出す
・Input.Check()からは各ボタンのCheck()が呼び出される(座標などの引数付き)
・各ボタンのCheck()では座標や状態の記録、フラグの取得が行われる
各ボタンのState配列には、現在を要素0として、MAXINPUTLOG分の過去の状態が要素1〜に記録されています。
つまり、要素0の値が1で要素1の値が0ならDownFlagがtrue、逆ならUpFlagがtrueとなるよう関数を作ります。
実際にボタンの状態が知りたいときは、メンバ引数を直接参照します。
例えば
if(Input.KeyBoard.Key[KEY_INPUT_ESCAPE].DownFlag) break;
などです。
(もし完全にカプセル化したい場合、読み出し専用のメンバ関数を作ることで解決できます)
こうすることで、メインプログラムからは
Input.Check()
を呼び出すだけで、入力の全状態を得られるようにできます。
(もちろん、クラスの中身をどう書くかは腕の見せ所ですが…)