TNP資料室 @ ウィキ

キーがどれだけの時間押されたかを調べる方法

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集
DXライブラリにはキーボードの押下状況を調べる関数としてGetHitKeyStateAll関数が用意されています。

int GetHitKeyStateAll( char *KeyStateBuf ) ;

引数にchar型の配列を渡すことで、全てのキーボードの押下状況を配列に格納します。




キーボードの押下状況を格納し、特定のキーが押されていたら文字を表示するプログラム
サンプルソース
#include"DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);
	if(DxLib_Init()==-1)
		return 1;
	SetDrawScreen(DX_SCREEN_BACK);

	while(1){
		if( ProcessMessage() != 0 || CheckHitKey( KEY_INPUT_ESCAPE ) != 0 )
			break;
		ClearDrawScreen();

		int white = GetColor( 255 , 255 , 255 );

		char Buf[ 256 ] ;			// かならずchar型の「256」個
		GetHitKeyStateAll( Buf ) ;		// 先頭アドレスを渡す

		if( Buf[ KEY_INPUT_Z ] == 1 )
			DrawString(100,100,"Zが押されています",white);
		else
			DrawString(100,100,"Zが押されていません",white);

		if( Buf[ KEY_INPUT_X ] == 1 )
			DrawString(100,120,"Xが押されています",white);
		else
			DrawString(100,120,"Xが押されていません",white);

		ScreenFlip();
	}
	DxLib_End();
	return 0;
}



これでキーボードの押下状況を調べることが出来ました。しかし、この方法では「キーボードがどれだの時間押されたか」を知ることはできません。
そこで、この関数を用いてint型の配列にキーボードの押下時間を格納する関数を作ろうと思います。(関数の作り方?)
関数名はコケいろ自分でわかりやすいようにつけたものなので参考程度に。

以降この関数は魔法の言葉?と同様、必ず使用します。


void GetKeyInput( int *KeyBuf ){
	char damy[256];
	GetHitKeyStateAll( damy ) ;
	for( int i=0 ; i<256 ; i++ ){
		if( damy[i] == 1 )
			KeyBuf[i]++;
		else
			KeyBuf[i] = 0;
	}
}

まずGetHitKeyStateAll関数を呼び出し、キーボードの押下状況を格納します。そして全ての要素を調べ、キーボードが押下されていたら対応するint型の要素をインクリメント?し、押下されていなかったら要素の値を0にします。これでキーボードの押下時間を格納することが出来ます。
 この関数は呼び出された時点での押下状況と前回呼び出されたときの押下状況を比較することで「押下され続けている」のか、という情報を得ています。この性質を持っているため、この関数はメインループで1周するごとに呼び出し、値を更新する必要があります。

キーボードの押下時間を調べ、表示するプログラム
#include"DxLib.h"

void GetKeyInput( int *KeyBuf );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);
	if(DxLib_Init()==-1)
		return 1;
	SetDrawScreen(DX_SCREEN_BACK);

	while(1){
		if( ProcessMessage() != 0 || CheckHitKey( KEY_INPUT_ESCAPE ) != 0 )
			break;
		ClearDrawScreen();

		int white = GetColor( 255 , 255 , 255 );

		int Buf[ 256 ];
		GetKeyInput( Buf );

		DrawFormatString(100,100,white,"Zが%4dフレーム押されました",Buf[ KEY_INPUT_Z ]);
		DrawFormatString(100,120,white,"Xが%4dフレーム押されました",Buf[ KEY_INPUT_X ]);
 		if( Buf[ KEY_INPUT_C ] >= 1*60 )	// 1秒以上押されたら
			DrawString(100,140,"Cが1秒以上押されました",white);

 		ScreenFlip();
 	}
 	DxLib_End();
	return 0;
}
void GetKeyInput( int *KeyBuf ){
	char damy[256];
	GetHitKeyStateAll( damy ) ;
	for( int i=0 ; i<256 ; i++ ){
		if( damy[i] == 1 )
			KeyBuf[i]++;
		else
			KeyBuf[i] = 0;
	}

}

タグ:

+ タグ編集
  • タグ:
ウィキ募集バナー