龍神録プログラミングの館3章のキー入力ついて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Panaché
記事: 4
登録日時: 6年前

龍神録プログラミングの館3章のキー入力ついて

#1

投稿記事 by Panaché » 6年前

既に何度かGetHitKeyStateAll_2関数については質問が投稿されていますがそれを何個か読んでもわからなかったので質問させて頂きます。
◯質問1
龍神録プログラミングの館の3章の

  if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク

という箇所で何故key.cpp内のCheckStateKey関数では何故戻り値が1になるのかがわかりません。
CheckHitKey(KEY_INPUT_ESCAPE)==1 とかだと、CheckHitKeyは押されていると1を返すのでbreakするのはわかるのですが、
KEY_INPUT_ESCAPEを引数として渡して、それをstateKey配列に入れるとどうして関数の戻り値のstateKey配列には1が格納されるのでしょうか…?

◯質問2
また、その上のGetHitKeyStateAll_2関数について質問なのですが、初めの

  GetHitKeyStateAll( GetHitKeyStateAll_Key );

で、配列のポインタにGetHitKeyStateAll関数を渡し、こうすることでGetHitStateAll関数はchar型配列全てのキーの押下状態を格納する
とあったのですが、ここではGetHitStateAll_Keyの配列256個に−1を代入しているのでしょうか?
というのもGetHitKeyStateAllのリファレンスで

  0:成功
  -1:エラー発生

と書いてあり、その下の例に

  1なら押されていて、0だと押されていません

とあったので、 0:成功=押されていない  -1:エラー発生=押されてる だと思いました。
しかしfor文内で
  if(GetHitKeyStateAll_Key==1) stateKey++;
   else stateKey=0;
とあるので1が格納されているのでしょうか。またそうであれば戻り値が0か−1なのに何故1なのでしょうか。

◯質問3
このfor文でstateKeyをインクリメントしている意味と0を格納している意味はなんですか?

◯質問4
この関数の戻り値が常に0なのになぜどのくらいキーが押されているかを判定できるのかいまいちわかりません。


わからないところだらけですみません…。

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: 龍神録プログラミングの館3章のキー入力ついて

#2

投稿記事 by Tatu » 6年前

質問2がわからないと質問1もわからないと思うので
まずは質問2から回答していきます。

GetHitKeyStateAll( GetHitKeyStateAll_Key );
について「0:成功 -1:エラー」と「1なら押されている。0なら押されていない」は別のことです。

「0:成功 -1:エラー」はGetHitKeyStateAll()でキーボードのキーの押下状態を取得することに成功しているかどうかを
表すGetHitKeyStateAll()の返り値です。GetHitKeyStateAll_Keyの要素には関係ありません。

「1なら押されている。0なら押されていない」は
GetHitKeyStateAll()が配列GetHitKeyStateAll_Keyの各要素に対して対応するキーが押されていれば1を代入。
押されていなければ0を代入しているということです。
よって配列GetHitKeyStateAll_Keyの要素は「0か-1」ではなく、「1か0」のどちらかとなります。


質問1について
エスケープキーが押された時
GetHitKeyStateAll(GetHitKeyStateAll_Key);
によってGetHitKeyStateAll_Key[KEY_INPUT_ESCAPE]に1が代入されます。
直後のfor文によってstateKey[KEY_INPUT_ESCAPE]がインクリメントされて1になります。
これによってエスケープキーが押された時のCheckStateKey(KEY_INPUT_ESCAPE)の戻り値は1になります。


質問3について
キーが押されている間は対応するstatekeyの要素がインクリメントされ続けます。
これによってキーが押され続けているフレーム数がわかります。
キーが押されていなければ0になります。


質問4について
GetHitKeyStateAll関数の戻り値ではなく、
参照渡しを利用して配列GetHitKeyStateAll_Keyの要素を書き換えているためです。

Panaché
記事: 4
登録日時: 6年前

Re: 龍神録プログラミングの館3章のキー入力ついて

#3

投稿記事 by Panaché » 6年前

丁寧な返信ありがとうございます!
もう少し疑問点が残るので質問させて頂きます。

◯質問5
質問4について
GetHitKeyStateAll関数の戻り値ではなく、
参照渡しを利用して配列GetHitKeyStateAll_Keyの要素を書き換えているためです。
とあったのですが、return 0 がGetHitKeyStateAllの戻り値では無いなく、stateKey配列の中の値を1か、0に変えるだけの関数ならば、void型の関数ではいけないのでしょうか?

◯質問6
新たな疑問なのですが、stateKey配列は256個あれば十分なのにもかかわらず、unsignedにしている理由は何かあるのでしょうか?

◯質問7
GetHitKeyStateAll_Key[KEY_INPUT_ESCAPE]に1が代入されます。
ということは具体的にKEY_INPUT_ESCAPEにchar型の何かが割り当てられているのでしょうか。
またその場合どのキーには何が割り当てられているのでしょうか。

◯質問8
main.cppの
 if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
で、Escを押すとstateKey[KEY_INPUT_ESCAPE]に1が入っているように思えます。
そうだとしたら、GetHitKeyStateAll_2関数でfor文を回してインクリメントしていく必要はあるのでしょうか?

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

Re: 龍神録プログラミングの館3章のキー入力ついて

#4

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

◯質問5

最初は意図があったんでしょうが最期まで忘れられている気がします。
なので、結果的にvoidでも問題ない関数と成っています。
私もご本人=管理人(Dixq)さんではないので、的確なことは言えないんです。
今のところ、正しく処理しなくても対して困らないってのが正しいところでしょうね。

◯質問6
新たな疑問なのですが、stateKey配列は256個あれば十分なのにもかかわらず、unsignedにしている理由は何かあるのでしょうか?

必要な個数とカウント数は全く別の話です。
2の31乗と2の32乗回数カウント出来る差でしか無いんですが、少なくとも-に成ることは無い数値なのでunsignedはそれを明確に表していて良いと思います。

◯質問7

KEY_INPUT_ESCAPEは配列の添字に使われている以上は数値です。
char型とかはここでは登場する必要のない言葉なので、勘違いされているところがあるのでは?と懸念されます。

◯質問8

>そうだとしたら、GetHitKeyStateAll_2関数でfor文を回してインクリメントしていく必要はあるのでしょうか?

カウントが押されてからの連続フレーム数をカウントする事に意味があります。
まぁ、EY_INPUT_ESCAPEでは大して意味ないですが、ボムの発射などではこれをしないと大変な事が起こりますよ。
理由は考えてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Panaché
記事: 4
登録日時: 6年前

Re: 龍神録プログラミングの館3章のキー入力ついて

#5

投稿記事 by Panaché » 6年前

質問6の配列に関しては勘違いしていました…。
Escキーを押した時に、KEY_INPUT_ESCAPEに割り当てられている数字というのは、
このサイトhttp://jonathan.tang.name/files/js_keyc ... ycode.html
で調べた数字(Escキーは27でした)とかで合ってますか?

アバター
Tatu
記事: 445
登録日時: 9年前
住所: 北海道

Re: 龍神録プログラミングの館3章のキー入力ついて

#6

投稿記事 by Tatu » 6年前

DXライブラリでは#defineの利用によって
KEY_INPUT_ESCAPEなどが数値として処理されるようになっています。
どのような数値かを知りたければDxLib.hとDxDirectX.hを調べればよいでしょう。
数値を知らなくてもDXライブラリの利用に問題はありませんが。

Panaché
記事: 4
登録日時: 6年前

Re: 龍神録プログラミングの館3章のキー入力ついて

#7

投稿記事 by Panaché » 6年前

DxLib.hには
  #define KEY_INPUT_ESCAPE D_DIK_ESCAPE
とあり、
DxDirectX.hには 
  #define D_DIK_ESCAPE DIK_ESCAPE
と、
  #define D_DIK_ESCAPE (0x01)
を見つけることが出来ました。


>Tatuさん、softya(ソフト屋)さん
たくさんの質問に対する返信本当にありがとうございました!

閉鎖

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