GetHitKeyStateAllについて

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

GetHitKeyStateAllについて

#1

投稿記事 by まさかりたろう » 9年前

こんばんは

GetHitKeyStateAll関数に、char型変数を渡すとき、256個の配列を渡しますよね。
この256という配列の1個1個の要素は、キーなのですか?( たとえば、KEY_INPUT_RETURN などのキー? )


後、ソースで疑問に思ったのですが、 ( 以下のソースは、ノベル風文字列表示のものです。 )
--- ---
for( i = 0; i < 256; i++ ) {
  if( oldKey[j] == 0 && Key[j] == 1 ) Key[j] = 2;
  oldKey[ j ] = Key[ j ];
}
--- ---
この場合に、 Key[ j ] はどういう意味で、どういう値をoldKeyに代入しているのでしょうか。
Key[ j ] とは、たとえば、Key[ 2 ]だった場合はどういう意味があるのでしょうか。



わかりにくい文章で申し訳ございません。。
ご教示いただけるととてもうれしいです。

よろしくお願いいたします。

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

Re: GetHitKeyStateAllについて

#2

投稿記事 by Tatu » 9年前

DXライブラリにおいて

DxLib.hでは
#define KEY_INPUT_RETURN D_DIK_RETURN// エンターキー
などのようにキーが定義されていて

DxDirectX.hではさらに
#define D_DIK_RETURN (0x1C)
のように定義されてます。

これらからそれぞれのキーに番号が割り振られていることがわかります。
そしてキーの番号は0x00から0xFFまででこれを16進法から10進法にすると
0から255までになります。

よってKey[256]の要素番号はキーの番号になります。

そして、それぞれの要素の持つ値は
GetHitKeyStateAll()により、押されていたら1、押されていなかったら0となるようになっています。

このため、リターンキーが押されていた場合はKey[KEY_INPUT_RETURN]は1になります。

Key[2]ならば2に割り振られたキーが押されているかどうかを表すことになります。
しかし、Key[KEY_INPUT_***]で扱うことができるため、数字でキーを指定する必要はありません。


さて、ソースの働きですが
最初はoldKey[j]は0で、Key[j]も0とします。
キーが押されるとKey[j]が1になり、if文の条件を満たすのでKey[j]=2になります。
そして、それをoldKey[j]に写してoldKey[j]が2になります。

その後、Key[j]が2ならばという条件を満たすので表示するメッセージが変わります。

次のループではoldKey[j]もKey[j]も2です。
キーが押しっぱなしの状態ならKey[j]は1になり、oldKey[j]は2であるためif文の条件を満たさず
Key[j]は1のままで、oldKey[j]も写されて1になります。メッセージは変わりません。

それ以降のループではキーを押しっぱなしのときどちらも1のままです。メッセージも変わりません。

キーを放せば両方とも0になります。このときもメッセージは変わりません。

以上のことからキーを押した瞬間だけメッセージが変わるようになっていることが分かったと思います。

まさかりたろう

Re: GetHitKeyStateAllについて

#3

投稿記事 by まさかりたろう » 9年前

Tatuさん、ご返答ありがとうございます。

つまり Key[ 1 ] は Key[ KEY_INPUT_RETURN ] と同じということでいいんですよね。

後、ソースの働きの方なのですが、キーが押されたらKey[ j ]が1になり... というのは、RETURN キーが押されたら、ということですか?


また、Key[ j ] の j の部分が 1 だった場合、Key[ 1 ] ということになるのですか?

ごめんなさい。。質問ばかりで申し訳ございません。

まさかりたろう

Re: GetHitKeyStateAllについて

#4

投稿記事 by まさかりたろう » 9年前

ある程度わかったような気がします。

forで回して、入力させて、入力のあったキー番号( Key[ j ] == 1 )に 2 を代入するということですね。
そして、それをoldKeyに代入して、次回のif文の時にはoldKey[ j ]は 2 になっているから、ループを抜け出して次の処理に行くということですね。


間違っていたらご指摘お願いします。。

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

Re: GetHitKeyStateAllについて

#5

投稿記事 by Tatu » 9年前

自分の文を読み返してみたらKey[j]の意味については説明してませんね。
まず、Key[256]は全てのキーの押され方を記憶しています。
一つ一つの要素の値は各キーに対応していて
0ならば押されていない
1ならば押されている
2ならばたった今押された
ということを表しています。

GetHitKeyStateAll関数のみを使っていた場合は
0と1の状態しか扱うことができないので
for文を使って2の状態も扱えるようにしています。

Key[j]はj番目の要素を表しています。jはfor文で0から255の範囲で変わるので
全てのキー(要素)について処理を行っていることがわかると思います。


ここで一つ質問をします。
もし、Key[KEY_INPUT_Z]が2であるならば
どういう状態を表していることになりますか?



質問への回答

1.Key[1]とKey[KEY_INPUT_RETURN]は同じではない。
先ほどのヘッダファイルの文をみると
KEY_INPUT_RETURNは0x1Cなので1ではありません。

もしかしたら
「a[3]=1;という文を見て a[1]はa[3]と同じになると考える」
というような間違いをしているかもしれません。

2.「Key[j]が1になり...」というのは全てのキー入力で同様で、それぞれ対応する要素が変化します。
ただし、メッセージを変える処理にかかわっているのはRETURNキーのみです。


3.Key[j]のjが1だった場合、Key[1]を示すというのはその通りです。
しかし、数字を使って指定するということはないと思います。
数字を覚えなくても済むようにするために
KEY_INPUT_RETURNなどが用意されているからです。


No:4について
「入力のあった」ではなく「たった今入力された」キーの状態を表す要素に2を代入しています。
これが(oldKey[j] == 0 && Key[j] == 1)という条件の意味です。

if文の条件を満たしてない場合、forループを抜けているわけではありません。
そのキーの状態を2にしないというだけで、oldKeyに今の状態を渡すのは変わりません。
また、その考えだと前に押されたキーの番号よりも後の番号のキーに対する
処理が行われないということになってしまいます。

まさかりたろう

Re: GetHitKeyStateAllについて

#6

投稿記事 by まさかりたろう » 9年前

Tatuさん、ご返答ありがとうございます。

だいぶわかってきました。
なんか難しく考えすぎていたようです。。


>もし、Key[KEY_INPUT_Z]が2であるならば どういう状態を表していることになりますか?
これはつまり、Zキーを「今押したよ」という状態ということでよろしいのでしょうか。

後, 0x1Cは 28 でしたね、、


処理の流れとしては、
--
① for文で全てのキーの状態を見る
② もしその中で、何かしらのキーを 押したらそのキーの状態を 2 に変えて「今押した」という状態にする
③ そしてその何かしらのキーのうち、「RETURN」キーが押されたら、次の処理が実行される

こういうことでよろしいのでしょうか。


自分はまだまだCの勉強不足かな?と思うところが多々ありました。。。
難しいですね。。

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

Re: GetHitKeyStateAllについて

#7

投稿記事 by Tatu » 9年前

質問に対する答えは期待通りです。

処理の流れも理解できていると思います。

何か書くとしたら

④ キーが押しっぱなしの場合はキーの状態が1に戻り、
RETURNキーを押しっぱなしにすることにより
メッセージが勝手に進むということがないようにしている

もつけたほうがよかったかなというくらいです。

プログラミングは書くほど慣れると思いますのでいろいろ書いてみてください。

まさかりたろう

Re: GetHitKeyStateAllについて

#8

投稿記事 by まさかりたろう » 9年前

Tatuさん、ご返答ありがとうございます。

キーが押しっぱなしだと状態は1になるのですか。
ここがなかなか分かりづらかったですけど、理解できました。( 多分... )

2になる時は、押された瞬間だけだから、押しっぱなしだと 1 に戻るのですよね!


自分は、配列のあたりが苦手なような気がします。。
もっと色々なプログラム書いて勉強したいとおもいます!

Tatuさん、ご教示ありがとうございました!!

まさかりたろう

Re: GetHitKeyStateAllについて

#9

投稿記事 by まさかりたろう » 9年前

解決押すの忘れていました。

ありがとうございました!!

閉鎖

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