龍神録プログラミング 8.キーコンフィグに対応させてみよう

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

龍神録プログラミング 8.キーコンフィグに対応させてみよう

#1

投稿記事 by コロッケ » 15年前

c言語歴は2カ月ちょっとで基礎中の基礎が分かるきらいの初心者です。
龍神録プログラミング 8.キーコンフィグに対応させてみようについて
質問させてもらいます。
//パッドとキーボードの両方の入力をチェックする関数
void GetHitPadStateAll(){
int i,PadInput,mul=1;
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key++;
else pad.key=0;
mul*=2;
}
input_pad_or_key(&pad.key[configpad.left] ,CheckStateKey(KEY_INPUT_LEFT ));
input_pad_or_key(&pad.key[configpad.up] ,CheckStateKey(KEY_INPUT_UP ));
input_pad_or_key(&pad.key[configpad.right] ,CheckStateKey(KEY_INPUT_RIGHT ));
input_pad_or_key(&pad.key[configpad.down] ,CheckStateKey(KEY_INPUT_DOWN ));
input_pad_or_key(&pad.key[configpad.shot] ,CheckStateKey(KEY_INPUT_Z ));
input_pad_or_key(&pad.key[configpad.bom] ,CheckStateKey(KEY_INPUT_X ));
input_pad_or_key(&pad.key[configpad.slow] ,CheckStateKey(KEY_INPUT_LSHIFT ));
input_pad_or_key(&pad.key[configpad.start] ,CheckStateKey(KEY_INPUT_ESCAPE ));
input_pad_or_key(&pad.key[configpad.change] ,CheckStateKey(KEY_INPUT_LCONTROL));
}
のif(PadInput & mul)の部分が分かりません…
PadInputとmulのアドレスがいっしょだったら真の条件だということでしょうか?
それmul*=2の部分なんですけど、なぜこのような処理を行わけければならないのかが分かりません…
このmul*=2の処理を行うことで、どのような意味があるでしょうか??

それともう一つあって、パッドとコンフィグの意味がいまいちわからない状態です。

すみませんが、ご回答をお願いします!

Ma

Re:龍神録プログラミング 8.キーコンフィグに対応させてみよう

#2

投稿記事 by Ma » 15年前

*=====追記
>それともう一つあって、パッドとコンフィグの意味がいまいちわからない状態です。
パッドとは
 ゲームパッドのこと
 ↓
 ゲームコントローラーのこと
 ↓
 USBでつなぐ、コントローラーのこと。

コンフィグ
 Configurationの略
 ↓
 設定という意味
 ↓
 今回の場合、パッド(USBでつなぐ、コントローラー)を設定すること。
 ↓
 どのボタンが、どの役目を担うかを設定すること。

*=====追記終わり

私もくわしくないので、間違ってたら、上級者の方ご指摘おねがいします。

&は、ビット演算子です。

int mul は次のように変化します。

1
2
4
8
16


ビット単位で表現すると

0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 1000
0000 0000 0000 0000 0000 0000 0001 0000
(intは4バイト、つまり32ビットです。)


このように左へ1がどんどん移動していることがわかります。


で、&演算子というのは左側の値と右側の値を比べたとき、
同じ位置のビット同士がONがあれば答えの中のその位置のビットもON、
同じ位置のビット同士のどちらか片方が0 または、両方0であれば結果も0 になります。
まさに、 AND または数学的に言えば ∩ です。


わかりやすい例をあげると、

0001 & 0010 = 0000



 0001
&0010
―――
=0000




1101 & 0001 = 0001



 1101
&0001
―――
=0001


のようになります。



で、
おそらく PadInput には、ビット単位でそのボタンがON だったかOFF だったかが記録されています。
すなわち、
PadInput = 0000 0000 0000 0000 0000 0000 0000 1001 = 9
となっていれば、ボタンがふたつおされていて、それ以外はおされていないとなります。
(どのビットがどのボタンになっているかは、私は知りませんが…。予想では、右から左へボタン1から上昇してるんじゃないかなと。)


そこで、あるボタンをOn/Off であるかを意味するのが一番右側のビットであるとして、それが押されたかどうかどうかをチェックするには、
0000 0000 0000 0000 0000 0000 0000 0001
この↑のintと、入力されたPadInputとで&演算子を使えばチェックできます。

つまり
PadInput & 0000 0000 0000 0000 0000 0000 0000 0001
が0以外(このボタンの場合1)なら、おされていることになる。

先ほどの例のように
PadInput = 0000 0000 0000 0000 0000 0000 0000 1001
これが入力されたとしたら、
PadInput & 0000 0000 0000 0000 0000 0000 0000 0001
= 0000 0000 0000 0000 0000 0000 0000 1001 & 0000 0000 0000 0000 0000 0000 0000 0001
= 0000 0000 0000 0000 0000 0000 0000 0001

こうなります、結果は、1となり、ボタンがおされていることがわかりました。


最初にもどると、右側の4バイトは1が左へ移動していくだけです。
左側のint すなわち PadInput は1フレームごとに変化するものなので、今回のスコープ内では普遍です。

これらを、&することで、ひとつひとつのボタンがおされているか、おされていないかがチェックできるということになります。


長々とした説明失礼しました。 画像

閉鎖

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