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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ze

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

#1

投稿記事 by ze » 14年前

こちらのサイトで勉強させていただいているのですが、わからないことがあるので質問させてください。
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という数字に意味はあるんでしょうか

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

ze

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

#2

投稿記事 by ze » 14年前

すみません。
勉強させていただいているのはゲームプログラミングの館様です。

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

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

#3

投稿記事 by naohiro19 » 14年前

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 ;
}

non
記事: 1097
登録日時: 15年前

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

#4

投稿記事 by non » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 14年前

押されるキーの種類が256種類で全て256となっています。
なので、iは常にキーの種類の番号です。つまりキーコードですね。
Key++ → キー配列(Key)のi番(キーの種類の番号)目を加算。
tmpKey → GetHitKeyStateAll関数で取得したキーの押下状態が格納されたtmpKeyのi番(キーの種類の番号)目の状態を参照。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ze

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

#6

投稿記事 by ze » 14年前

ご返答ありがとうございます。
iの中にキーコードが入っているということは理解しているんですが、
int Key[256]; // キーが押されているフレーム数を格納する でkey[]のなかにはフレーム数が入っているんではないのでしょうか
int Key[256];  と Keyとは関係ないものなんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 14年前

ze さんが書きました:ご返答ありがとうございます。
iの中にキーコードが入っているということは理解しているんですが、
int Key[256]; // キーが押されているフレーム数を格納する でkey[]のなかにはフレーム数が入っているんではないのでしょうか
int Key[256];  と Keyとは関係ないものなんですか?


それはC言語の文法に対する質問ですか?
int Key[256];はKeyと言う256個の要素を持つ配列を定義するものです。
これが無いとメモリ空間にKey配列は割り当てられません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ze

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

#8

投稿記事 by ze » 14年前

int Key[256];にはキーが押されているフレーム数を格納するとありますが
その後でkey配列の中にキーコードを入れているのでフレーム数はどこに行ったのかと疑問に思っています。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

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

#9

投稿記事 by beatle » 14年前

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

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

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

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

non
記事: 1097
登録日時: 15年前

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

#10

投稿記事 by non » 14年前

たとえば、大文字のAのアスキーコードは16進数で0x41ですから、10進数では65です。
従って、key[6465]の配列がAのための配列です。
この配列は最初に0が入れられています。

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

訂正しました。
最後に編集したユーザー non on 2012年6月14日(木) 10:39 [ 編集 1 回目 ]
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#11

投稿記事 by softya(ソフト屋) » 14年前

KeyはKey配列のi番目という意味しかありません。
代入されるか、参照されるか、インクリメント/デクリメントされるかは式に書かれている内容によります。

こう言う疑問が出ると言うことは、C言語の配列についての知識が足らないと思いますのでC言語の入門書などでちゃんと勉強されたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ze

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

#12

投稿記事 by ze » 14年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る