キー入力クラス

アバター
a5ua
記事: 199
登録日時: 14年前

キー入力クラス

投稿記事 by a5ua » 14年前

ゲームプログラミングで必須となるであろう処理の一つとして、
キー入力処理があります。

どんなゲームにも使える処理というのは、部品としてまとめておくと便利です。
C++なら当然クラスを使うことが考えられます。

そこで今回は、DXライブラリを使った場合のキー入力クラスを考えます。

あるキーが押されているかどうかを調べるのは、

CODE:

DxLib::CheckHitKey(int KeyCode);
DxLib::GetHitKeyStateAll(char *KeyStateBuf);
などの関数を使えばできますが、あるキーが今の瞬間押されたかどうかを判定することはできません。
しかし、このような処理は必要になるでしょうから、押された瞬間も調べることができるクラスを作ります。
キー入力クラスの使い方は次のようになるでしょう。

CODE:

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が離された瞬間の処理
	}
}
KeyInputクラスの実装方法としては、
現在の入力状態に加えて、前回の入力状態を保持する方法が考えられます。
この二つの状態がわかれば、

「前回押されていない」かつ「現在押されている」⇒「押された瞬間」

となります。

別の方法としては、
入力状態と、キーの押されている状態の持続回数を保持する方法があります。
この方法では、

「持続回数 > 0」⇒「押されている」
「持続回数 = 1」⇒「押された瞬間」

のようになります。

以下のコードは、後者の方法を採用しています。
実装方法はこれだけではないと思いますので、自分なりのクラスを作ってみるといいでしょう。

【KeyInput.h】

CODE:

#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];
	};
}
【KeyInput.cpp】

CODE:

#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;
}
最後に編集したユーザー a5ua on 2010年10月26日(火) 23:25 [ 編集 1 回目 ]

コメントはまだありません。