キー入力処理があります。
どんなゲームにも使える処理というのは、部品としてまとめておくと便利です。
C++なら当然クラスを使うことが考えられます。
そこで今回は、DXライブラリを使った場合のキー入力クラスを考えます。
あるキーが押されているかどうかを調べるのは、 などの関数を使えばできますが、あるキーが今の瞬間押されたかどうかを判定することはできません。
しかし、このような処理は必要になるでしょうから、押された瞬間も調べることができるクラスを作ります。
キー入力クラスの使い方は次のようになるでしょう。
KeyInput key; // キー入力クラスのオブジェクト
while (true) {
key.update(); // 入力状態の更新
if (key.is_pressed(key_code)) {
// key_codeが押されているときの処理
}
if (key.is_triggered(key_code)) {
// key_codeが押された瞬間の処理
}
if (key.is_released(key_code)) {
// key_codeが離された瞬間の処理
}
}
現在の入力状態に加えて、前回の入力状態を保持する方法が考えられます。
この二つの状態がわかれば、
「前回押されていない」かつ「現在押されている」⇒「押された瞬間」
となります。
別の方法としては、
入力状態と、キーの押されている状態の持続回数を保持する方法があります。
この方法では、
「持続回数 > 0」⇒「押されている」
「持続回数 = 1」⇒「押された瞬間」
のようになります。
以下のコードは、後者の方法を採用しています。
実装方法はこれだけではないと思いますので、自分なりのクラスを作ってみるといいでしょう。
【KeyInput.h】
#pragma once
namespace a5ua
{
class KeyInput
{
public:
KeyInput();
void update();
bool is_pressed(int code) const;
bool is_triggered(int code) const;
bool is_released(int code) const;
private:
char m_buffer[256];
int m_count[256];
};
}
#include "KeyInput.h"
#include
#include
namespace a5ua
{
KeyInput::KeyInput()
{
memset(m_buffer, 0, sizeof(m_buffer));
memset(m_count, -1, sizeof(m_count));
}
void KeyInput::update()
{
char prev_buffer[256];
memcpy(prev_buffer, m_buffer, sizeof(m_buffer));
GetHitKeyStateAll(m_buffer);
for (int i = 0; i 0;
}
bool KeyInput::is_triggered(int code) const
{
assert(0
#include "KeyInput.h"
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
ChangeWindowMode(TRUE); // ウィンドウモードで起動
SetMainWindowText(_T("キー入力クラスのテスト"));
if (DxLib_Init() != 0) {
return -1;
}
SetDrawScreen(DX_SCREEN_BACK);
a5ua::KeyInput key;
while (ProcessMessage() == 0) {
ClearDrawScreen();
key.update(); // ループの最初に一度だけ呼び出す
if (key.is_pressed(KEY_INPUT_ESCAPE)) {
break;
}
const int WHITE = GetColor(255, 255, 255);
const int x[3] = {20, 120, 220};
int y[3] = {};
for (int i = 0; i < 256; ++i) {
// 押されているキー
if (key.is_pressed(i)) {
DrawFormatString(x[0], y[0] + 20, WHITE, _T("%d"), i);
y[0] += 20;
}
// 押された瞬間のキー
if (key.is_triggered(i)) {
DrawFormatString(x[1], y[1] + 20, WHITE, _T("%d"), i);
y[1] += 20;
}
// 離された瞬間のキー
if (key.is_released(i)) {
DrawFormatString(x[2], y[2] + 20, WHITE, _T("%d"), i);
y[2] += 20;
}
}
ScreenFlip();
WaitTimer(1);
}
DxLib_End();
return 0;
}