ためしに、先ほど書いたテスト処理を次のように修正しよう。
if (Input::IsKey(DIK_ESCAPE))
{
static int cnt = 0;
cnt++;
if (cnt >= 3)
{
PostQuitMessage(0);
}
}
こうすると、ESCキーを3回押さないとプログラムは終了しないはずだが・・・やってみよう。
「キーを押しているかどうか」ではなく「今キーを押したかどうか」を調べる必要がある。
DirectInputはキーボードの今の状態を調べる能力しかないので、基本機能だけでこれは調べられない。
しかし、考え方を変えれば「今キーを押した」というのは「今は押してるけど、さっきまでは押してない」ということだから、直前のキーの状態を覚えておけばいいだけだ。
<Input.h>
namespace Input
{
void Initialize(HWND hWnd);
void Update();
bool IsKey(int keyCode);
bool IsKeyDown(int keyCode);
void Release();
};
<Input.cpp>
namespace Input
{
:
:
//キーボード
LPDIRECTINPUTDEVICE8 pKeyDevice; //デバイスオブジェクト
BYTE keyState[256]; //現在の各キーの状態
BYTE prevKeyState[256]; //前フレームでの各キーの状態
:
:
void Update()
{
memcpy(●●●●●●●●●●●●●●●●●●);
pKeyDevice->Acquire();
pKeyDevice->GetDeviceState(sizeof(keyState), &keyState);
}
:
:
bool IsKeyDown(int keyCode)
{
//今は押してて、前回は押してない
if (●●●●●●●●●●●●●●●●●●●●)
{
return true;
}
return false;
}
これで押した瞬間が判定できるようになった。
WinMainに書いたテスト処理をIsKeyDownに書き換えれば、ESCを3回押した時に終了するはず。
それほど使用頻度は高くないが、キーを放した瞬間も取得できるようにしておこう。
先ほどの考え方でいけば、「さっきは押してて、今は押してない状態」を検出すればいい。
<Input.h>
namespace Input
{
void Initialize(HWND hWnd);
void Update();
bool IsKey(int keyCode);
bool IsKeyDown(int keyCode);
bool IsKeyUp(int keyCode);
void Release();
};
<Input.cpp>
bool IsKeyUp(int keyCode)
{
(自分で考えよう)
}
WinMainのテスト処理を直して、ESCを押して放すとプログラムが終了するようにしてみよう。
正しく動作することを確認したら、そのテスト処理は削除していい。