ページ 11

キー入力処理について質問です

Posted: 2014年6月23日(月) 02:56
by donabe
 初めてここを利用させていただくので色々間違い等あるかもしれませんがよろしくお願いします。
今回はキー入力の処理について質問します。
今自分はポリゴンをキー入力で移動させるにあたってキー入力処理のプログラムを作っています。
とりあえず学校で習った範囲でプログラムを書いてみたのですが入力処理(トリガー、リリース、リピート)の判定のさせ方がよくわかりません。
以下ソースコードです。

コード:

/*****************************************************************************/
/*						インクルードファイル								 */
/*****************************************************************************/
#include"main.h"
#include"polygon.h"
#include"input.h"
/*****************************************************************************/
/*							グローバル変数									 */
/*****************************************************************************/
LPDIRECTINPUT8 g_pDInput = NULL;
LPDIRECTINPUTDEVICE8 g_pDIDevKeyboard = NULL;

BYTE g_aKeyState[256];
BYTE g_aKeyStateTrigger[256];
BYTE g_aKeyStateRelease[256];
BYTE g_aKeyStateRepeat[256];
int g_aKeyStateRepeatCount[256];
/*****************************************************************************/
/*							初期化処理										 */
/*****************************************************************************/
HRESULT InitKeyboard(HINSTANCE hInstance, HWND hWnd)
{
	HRESULT hr;
	if(g_pDInput == NULL)
	{
		hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION,
							IID_IDirectInput8, (void**)&g_pDInput, NULL);

		if(FAILED(hr))
		{
			return hr;
		}

		hr = g_pDInput -> CreateDevice(GUID_SysKeyboard,&g_pDIDevKeyboard,NULL);

		if(FAILED(hr))
		{
			return hr;
		}

		hr = g_pDIDevKeyboard -> SetDataFormat(&c_dfDIKeyboard);

		if(FAILED(hr))
		{
			return hr;
		}

		g_pDIDevKeyboard -> Acquire();

		return S_OK;
	
	}

}

/*****************************************************************************/
/*							終了処理										 */
/*****************************************************************************/
void UninitKeyboard(void)
{
	if(g_pDIDevKeyboard != NULL)
	{
		g_pDIDevKeyboard -> Unacquire();
	}
	if(g_pDInput != NULL)
	{

	}
}

/*****************************************************************************/
/*							更新処理										 */
/*****************************************************************************/
void UpdateKeyboard(void)
{
	BYTE aKeyState[256];
	if(SUCCEEDED(g_pDIDevKeyboard -> GetDeviceState(sizeof(aKeyState),&aKeyState[0])))
	{
		for(int nKey=0; nKey<256; nKey++)
		{
			g_aKeyStateTrigger[nKey] = //トリガーの処理
			g_aKeyStateRelease[nKey] = //リリースの処理
			g_aKeyStateRepeat[nKey] =  //リピートの処理
			g_aKeyState[nKey] = aKeyState[nKey];
		}
	}
	else
	{
		g_pDIDevKeyboard -> Acquire();
	}

}
/*****************************************************************************/
/*							キーボードの入力処理							 */
/*****************************************************************************/
	//キーボードのプレス状態を取得
bool GetKeyboardPress(int nKey)
{
	return (g_aKeyState[nKey]&0x80) ? true : false;
}
	//キーボードのリピート状態を取得
bool GetKeyboardRepeat(int nKey)
{
	return(g_aKeyStateRepeat[nKey]&0x80) ? true : false;
}
とりあえずここまで書いたのですがトリガー、リリース、リピートの処理の書き方がわからなくて・・・
プログラム初心者なのでこのコードも半分くらいしか理解できてません・・・わかりやすく教えていただけると嬉しいです。

Re: キー入力処理について質問です

Posted: 2014年6月23日(月) 21:24
by softya(ソフト屋)
押された瞬間がトリガーで、離した瞬間がリリース(あるいは離れている間)、押されている間に何フレームか毎にトリガになるのがリピートでしょうか(それとも押されている間ずっとON)?
仕様が明確ではないので、答えるのも難しいです。
DitectXで有ることはコードから読み取れますが。

Re: キー入力処理について質問です

Posted: 2014年6月23日(月) 22:20
by donabe
 返信ありがとうございます。
押された瞬間がトリガー、離れた瞬間がリリース、押した瞬間に動作してその後ずっと押されていたら押されている間動くのがリピートという感じです。
わかりにくくてすみません・・・

Re: キー入力処理について質問です

Posted: 2014年6月24日(火) 00:01
by softya(ソフト屋)
ここのキーボードのキーの処理が参考になると思います。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/02_09.html
リリースはトリガの全く逆の処理を作るだけですね。

Re: キー入力処理について質問です

Posted: 2014年6月24日(火) 22:25
by donabe
 返信遅れてすみません。 
サイトを参考にどうにか完成させられました。ありがとうございましたm(_)m