今回は、ゲーム制作では欠かせないキーボードによる入力をやって行きます。
扱っていくのはDirectInputを使って行きます。
パッド対応させたい場合は、XInputがいいみたいですが、
キーボードだけならこっちの方が簡単だと思います。
Input.h
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// キー最大数
#define KEY_MAX 256
class Window;
class Input
{
public:
// コンストラクタ
Input(Window* win);
// デストラクタ
~Input();
// キー入力
bool CheckKey(UINT index);
// トリガーの入力
bool TriggerKey(UINT index);
private:
// インプットの生成
HRESULT CreateInput(void);
// キーデバイスの生成
HRESULT CreateKey(void);
// キーフォーマットのセット
HRESULT SetKeyFormat(void);
// キーの協調レベルのセット
HRESULT SetKeyCooperative(void);
// ウィンドウ
Window* win;
// 参照結果
HRESULT result;
// インプット
LPDIRECTINPUT8 input;
// インプットデバイス
LPDIRECTINPUTDEVICE8 key;
// キー情報
BYTE keys[KEY_MAX];
// 前のキー情報
BYTE olds[KEY_MAX];
};
Input.cpp
#include "Input.h"
#include "Window.h"
#pragma comment(lib, "dinput8.lib")
#pragme comment(lib, “dxguid.lib”)
// 解放マクロ
#define Release(X) { if((X) != nullptr) (X)->Release(); (X) = nullptr; }
// コンストラクタ
Input::Input(Window* win) :
win(win), result(S_OK), input(nullptr), key(nullptr)
{
memset(&keys, 0, sizeof(keys));
memset(&olds, 0, sizeof(olds));
CreateInput();
CreateKey();
SetKeyFormat();
SetKeyCooperative();
}
// デストラクタ
Input::~Input()
{
Release(key);
Release(input);
delete win;
}
// インプットの生成
HRESULT Input::CreateInput(void)
{
result = DirectInput8Create(GetModuleHandle(0), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)(&input), NULL);
return result;
}
// キーデバイスの生成
HRESULT Input::CreateKey(void)
{
result = input->CreateDevice(GUID_SysKeyboard, &key, NULL);
return result;
}
// キーフォーマットのセット
HRESULT Input::SetKeyFormat(void)
{
result = key->SetDataFormat(&c_dfDIKeyboard);
return result;
}
// キーの協調レベルのセット
HRESULT Input::SetKeyCooperative(void)
{
result = key->SetCooperativeLevel(win->GetHandle(), DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
//入力デバイスへのアクセス権利を取得
key->Acquire();
return result;
}
// キー入力
bool Input::CheckKey(UINT index)
{
//チェックフラグ
bool flag = false;
//キー情報を取得
key->GetDeviceState(sizeof(keys), &keys);
if (keys[index] & 0x80)
{
flag = true;
}
olds[index] = keys[index];
return flag;
}
// トリガーの入力
bool Input::TriggerKey(UINT index)
{
//チェックフラグ
bool flag = false;
//キー情報を取得
key->GetDeviceState(sizeof(keys), &keys);
if ((keys[index] & 0x80) && !(olds[index] & 0x80))
{
flag = true;
}
olds[index] = keys[index];
return flag;
}
こんな感じで実装してます。
ほとんどデフォルトの設定なのでオリジナルのキーを使いたい場合は、
フォーマットのセット部分を自作のものに変えれば大丈夫なはずです。