ページ 11

全てのキーの入力状態を取得する について

Posted: 2012年6月13日(水) 02:04
by ze
こちらのサイトで勉強させていただいているのですが、わからないことがあるので質問させてください。
2.9章 全てのキーの入力状態を取得するの

コード:

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;

}
の部分なんですが for( int i=0; i<256; i++ ) や Key++; では i に数字が、 if( tmpKey != 0 ) では i にキーコードが入っているように見えるんですが、 i にはキーコードとフレーム数が両方入って
いるということなんですか
iにはキーコードなどが入るのになぜ条件式で加算しているのでしょうか
それと char tmpKey[256]; にはキーコードが256種類入っていると分かるんですが、int Key[256] や for( int i=0; i<256; i++ ){  の256という数字に意味はあるんでしょうか

初心者の為根本的な間違いが多々あると思いますがご返答をよろしくお願いします。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月13日(水) 02:25
by ze
すみません。
勉強させていただいているのはゲームプログラミングの館様です。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月13日(水) 08:52
by naohiro19
DXライブラリのこの関数が役割を果たしています。

コード:

// すべてのキーの押下状態を取得する
int NS_GetHitKeyStateAll( char *KeyStateBuf )
{
	int i ;
	char *Buf = (char *)KeyStateBuf ;

	if( WinData.ActiveFlag == FALSE )
		DxActiveWait() ;

	// 初期化判定
	if( DInputData.DirectInputObject == NULL && NS_GetWindowCloseFlag() == FALSE )
		return InitializeDirectInput() ;

	// キーボードの入力状態を更新
	UpdateKeyboardInputState() ;

	// キーの入力値を変換
	for( i = 0 ; i < 256 ; i ++ , KeyStateBuf ++ )
	{
		*KeyStateBuf = ( BYTE )( DInputData.KeyInputBuf[i] ) >> 7 ;
	}
	F10Process() ;
//	Buf[KEY_INPUT_F10] = (char)DInputData.F10Flag ;
//	Buf[KEY_INPUT_F12] = (char)DInputData.F12Flag ;

	// 終了
	return 0 ;
}

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月13日(水) 11:15
by non
まず、インターネットから「アスキーコード表」で検索しましょう。
すると、例えば、
http://www110.kir.jp/study/jissen/asciicode.html
のような表が出てきます。コンピュータで扱う文字は、このアスキーコードが一般的に使われます。他にもありますが・・・
16進数の00からFFまでですから10進で言えば、0~255までになります。従って、256種類の文字を扱えます。
256種類の文字のどのキーが押されたか、調べるのに、256個の配列を用意してます。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月13日(水) 13:08
by softya(ソフト屋)
押されるキーの種類が256種類で全て256となっています。
なので、iは常にキーの種類の番号です。つまりキーコードですね。
Key++ → キー配列(Key)のi番(キーの種類の番号)目を加算。
tmpKey → GetHitKeyStateAll関数で取得したキーの押下状態が格納されたtmpKeyのi番(キーの種類の番号)目の状態を参照。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月14日(木) 00:23
by ze
ご返答ありがとうございます。
iの中にキーコードが入っているということは理解しているんですが、
int Key[256]; // キーが押されているフレーム数を格納する でkey[]のなかにはフレーム数が入っているんではないのでしょうか
int Key[256];  と Keyとは関係ないものなんですか?

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月14日(木) 00:26
by softya(ソフト屋)
ze さんが書きました:ご返答ありがとうございます。
iの中にキーコードが入っているということは理解しているんですが、
int Key[256]; // キーが押されているフレーム数を格納する でkey[]のなかにはフレーム数が入っているんではないのでしょうか
int Key[256];  と Keyとは関係ないものなんですか?


それはC言語の文法に対する質問ですか?
int Key[256];はKeyと言う256個の要素を持つ配列を定義するものです。
これが無いとメモリ空間にKey配列は割り当てられません。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月14日(木) 07:29
by ze
int Key[256];にはキーが押されているフレーム数を格納するとありますが
その後でkey配列の中にキーコードを入れているのでフレーム数はどこに行ったのかと疑問に思っています。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月14日(木) 07:34
by beatle
ze さんが書きました: その後でkey配列の中にキーコードを入れている
具体的にどの部分が、Key配列の中にキーコードを入れている処理だと思っていますか?
(「入れている」を代入のことだと仮定して話します)

Keyを変更する処理は
Key++;

Key = 0;
しかありませんが、僕にはそのどちらもキーコードを代入しているようには見えません。

もしかして、Keyのiがフレーム数だと思ってらっしゃいますか?
それならそれは間違いです。このときのiもキーコードを示しており、「キーコードiを持つキーが押され続けているフレーム数」を表すのがKeyです。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月14日(木) 10:05
by non
たとえば、大文字のAのアスキーコードは16進数で0x41ですから、10進数では65です。
従って、key[6465]の配列がAのための配列です。
この配列は最初に0が入れられています。

Aのキーを押していると
Key[64]++;
key[65]++;されます。
これが、1フレームに1回カウントアップされますから、キーを押している間のフレーム数がカウントされます。

訂正しました。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月14日(木) 10:10
by softya(ソフト屋)
KeyはKey配列のi番目という意味しかありません。
代入されるか、参照されるか、インクリメント/デクリメントされるかは式に書かれている内容によります。

こう言う疑問が出ると言うことは、C言語の配列についての知識が足らないと思いますのでC言語の入門書などでちゃんと勉強されたほうが良いと思います。

Re: 全てのキーの入力状態を取得する について

Posted: 2012年6月14日(木) 18:29
by ze
ご返答ありがとうございます。
beatleさんの仰る通り、iにフレーム数が入るものだと勘違いしていました。
iにキーコードが入り、key自体がフレーム数を表すと言うことだったんですね。
こういった勘違いがないようにもっとしっかり勉強しようと思います。
皆さんとても丁寧な対応を有難うございました。