ページ 1 / 1
龍神録プログラミングの館3章のキー入力ついて
Posted: 2013年7月13日(土) 00:20
by Panaché
既に何度か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なのになぜどのくらいキーが押されているかを判定できるのかいまいちわかりません。
わからないところだらけですみません…。
Re: 龍神録プログラミングの館3章のキー入力ついて
Posted: 2013年7月13日(土) 07:47
by Tatu
質問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の要素を書き換えているためです。
Re: 龍神録プログラミングの館3章のキー入力ついて
Posted: 2013年7月13日(土) 20:24
by Panaché
丁寧な返信ありがとうございます!
もう少し疑問点が残るので質問させて頂きます。
◯質問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文を回してインクリメントしていく必要はあるのでしょうか?
Re: 龍神録プログラミングの館3章のキー入力ついて
Posted: 2013年7月13日(土) 20:57
by softya(ソフト屋)
◯質問5
最初は意図があったんでしょうが最期まで忘れられている気がします。
なので、結果的にvoidでも問題ない関数と成っています。
私もご本人=管理人(Dixq)さんではないので、的確なことは言えないんです。
今のところ、正しく処理しなくても対して困らないってのが正しいところでしょうね。
◯質問6
新たな疑問なのですが、stateKey配列は256個あれば十分なのにもかかわらず、unsignedにしている理由は何かあるのでしょうか?
必要な個数とカウント数は全く別の話です。
2の31乗と2の32乗回数カウント出来る差でしか無いんですが、少なくとも-に成ることは無い数値なのでunsignedはそれを明確に表していて良いと思います。
◯質問7
KEY_INPUT_ESCAPEは配列の添字に使われている以上は数値です。
char型とかはここでは登場する必要のない言葉なので、勘違いされているところがあるのでは?と懸念されます。
◯質問8
>そうだとしたら、GetHitKeyStateAll_2関数でfor文を回してインクリメントしていく必要はあるのでしょうか?
カウントが押されてからの連続フレーム数をカウントする事に意味があります。
まぁ、EY_INPUT_ESCAPEでは大して意味ないですが、ボムの発射などではこれをしないと大変な事が起こりますよ。
理由は考えてみて下さい。
Re: 龍神録プログラミングの館3章のキー入力ついて
Posted: 2013年7月14日(日) 09:45
by Panaché
質問6の配列に関しては勘違いしていました…。
Escキーを押した時に、KEY_INPUT_ESCAPEに割り当てられている数字というのは、
このサイト
http://jonathan.tang.name/files/js_keyc ... ycode.html
で調べた数字(Escキーは27でした)とかで合ってますか?
Re: 龍神録プログラミングの館3章のキー入力ついて
Posted: 2013年7月14日(日) 13:01
by Tatu
DXライブラリでは#defineの利用によって
KEY_INPUT_ESCAPEなどが数値として処理されるようになっています。
どのような数値かを知りたければDxLib.hとDxDirectX.hを調べればよいでしょう。
数値を知らなくてもDXライブラリの利用に問題はありませんが。
Re: 龍神録プログラミングの館3章のキー入力ついて
Posted: 2013年7月14日(日) 18:35
by Panaché
DxLib.hには
#define KEY_INPUT_ESCAPE D_DIK_ESCAPE
とあり、
DxDirectX.hには
#define D_DIK_ESCAPE DIK_ESCAPE
と、
#define D_DIK_ESCAPE (0x01)
を見つけることが出来ました。
>Tatuさん、softya(ソフト屋)さん
たくさんの質問に対する返信本当にありがとうございました!