5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DirectX キー入力

Last updated at Posted at 2018-08-13

今回は、ゲーム制作では欠かせないキーボードによる入力をやって行きます。
扱っていくのは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;
}

こんな感じで実装してます。
ほとんどデフォルトの設定なのでオリジナルのキーを使いたい場合は、
フォーマットのセット部分を自作のものに変えれば大丈夫なはずです。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?