まず、
DXライブラリの関数の話であると仮定します。
らっせる さんが書きました:①tmpKey[0]には何が格納されているのでしょうか?右シフトキーの状態?バックスペースの状態?
ここではDXライブラリ Ver3.16dのソースコードに基づいて解析します。
まず、GetHitKeyStateAll()関数はDxGateway.cppで定義され、NS_GetHitKeyStateAll()関数を呼び出しています。
NS_GetHitKeyStateAll()関数はDxInput.cppで定義され、
UpdateKeyboardInputState()関数で「キーボードの入力状態を更新」した後、「キーの入力値を変換」しています。
ここで使用されているInputSysDataはDxInput.hで定義されているINPUTSYSTEMDATA型で、KeyInputBufはunsigned char型の配列です。
従って、unsigned char型の精度が8ビットであればMSBがキーの状態として出力の配列に格納されます。
UpdateKeyboardInputState()関数もDxInput.cppで定義され、「環境依存処理」のUpdateKeyboardInputState_PF()関数を呼び出しています。
UpdateKeyboardInputState_PF()関数はWindows/DxInputWin.cppで定義され、
Windows APIのGetKeyboardState()関数を利用してキー情報を取得した後Windows/DxInputWin.cppで定義されたテーブルを用いて変換を行うか、
DirectInputのGetDeviceState()関数を利用してキー情報を取得しています。
GetKeyboardState()関数で取得できる情報は
「最上位ビットが 1 のときはキーが押されていることを、0 のときはキーが押されていないことを示します。」と定義されているので、
NS_GetHitKeyStateAll()関数での変換でキーが押されているかどうかを0/1で取得することができます。
また、DirectInputのGetDeviceState()関数で取得できる値は、
キーボードの直接データにおいて
「IDirectInputDevice8::GetDeviceState メソッドの動作は、Microsoft Win32 の GetKeyboardState 関数と同じです。」
「このバイトの上位ビットが設定されている場合は、キーが押されています。」
と定義されています。
従って、同様にNS_GetHitKeyStateAll()関数での変換でキーが押されているかどうかを0/1で取得することができます。
ここで、テーブルで使用されるキーに対応する添字であるD_DIK_*はWindows/DxDirectX.hで定義されています。
この定義の中に0に定義されているものはありません。さらに、DirectInputを使用しない場合はキーの状態を全て0に初期化した後、
テーブルに格納された格納先の添字に対してデータの格納が行われます。
この格納先の添字は全てD_DIK_*が使われているので、0番目に代入が行われることはないので、0番目は常に0になります。
DirectInputを使用する場合は、GetKeyboardState()関数で取得した値で上書きされる右シフトを除いて、
DirectInputで取得した値が直接キー情報として格納されます。
これの0番目がどうなるかはわかりませんでしたが、
DirectInput キー識別コード表で0番目の定義はなかったので、多分意味のない値だと思います。
まとめとして、GetHitKeyStateAll()が成功した場合、tmpKey[0]には
・DirectInputを使用しない場合、0
・DirectInputを使用する場合、意味のない値?
が格納されるでしょう。
らっせる さんが書きました:②ソースコードの中にもコメント"//ここ!!"をいれたのですが、なぜ配列で0~256としているのに数字でもない"KEY_INPUT_RIGHT"が来るのでしょうか?
数字を直接書く(
マジックナンバー)よりDxLib.hで定義された定数を利用するほうがコードが読みやすく、エンバグしにくくなるからでしょう。
オフトピック
「配列で0~256としている」とはどういうことでしょうか?
ここで使用されている配列Keyは256要素であり、有効な要素はKey[0]~Key[255]です。
Key + 256はポインタ操作では有効ですが、デリファレンスしてはいけません。