龍神録プログラミングの館
龍神録プログラミングの館
龍神録プログラミングの館の8章のvoid GetHitPadStateAll関数なのですが序盤のfor文の内容が理解できません(>_<)お優しいどなたご教授願えますか?
Re: 龍神録プログラミングの館
int i,PadInput,mul=1;
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key[i]++;
else pad.key[i]=0;
mul*=2;
}
PadInput には十進の 5 が入ります。これは 二進で 00000110 です。
なぜなら、次の定義により左ボタンは右から 1ビット目、右ボタンは
右から 2ビット目となるので、それらのビットが立っているのです。
//一番最初の初期化
void first_ini(){
ch.x=FIELD_MAX_X/2;
ch.y=FIELD_MAX_Y*3/4;
configpad.down=0;
configpad.left=1;
configpad.right=2;
configpad.up=3;
configpad.bom=4;
configpad.shot=5;
configpad.slow=11;
configpad.start=13;
configpad.change=6;
}
これは 2 進で 1, 10, 100, 1000, ...です。
PadInput と mul で &演算を行うことにより、PadInput の下位から
順番にそのビットが 0 か 1 かが分かり、pad.key に 0 か 0で
ない値を設定できます。
ビット演算を行うのだから、mul *= 2; の代わりに
mul <<= 1; とシフト演算子を使うほうが分かりやすいでしょう。
どこが分からなかったのかを教えてください。
Re: 龍神録プログラミングの館
かずま さんが書きました: ↑5年前PadInput と mul で &演算を行うことにより、PadInput の下位から
順番にそのビットが 0 か 1 かが分かり、pad.key に 0 か 0で
ない値を設定できます。
最後の部分を次のように訂正します。
pad.key[ i] に 0 か 0でない値を設定できます。
Re: 龍神録プログラミングの館
すみません。間違っています。次のように訂正します。
PadInput には十進の 6 が入ります。これは 二進で 00000110 です。
Re: 龍神録プログラミングの館
i は 0~15 の値を取り、それはジョイパッドのボタン番号です。agunesu さんが書きました: ↑5年前AND演算子で比べることはわかったのですが、結局iには何の数字が入るのですか?
下ボタンは 0、左ボタンは 1、...、スタートボタンは 13。
PadInput は int で、その下位16ビットの各ビットが 0 か 1 かで、
どのボタンが押されたのかを示します。
スタートボタンが押されたら、右から13ビット目が 1 になりますから、
二進で 0010000000000000、それは十進で 8192 です。
for (i = 0; i < 16; i++) { により、
まず i は 0 で mul は 1 ですから、
PadInput & mul は、0010000000000000 & 0000000000000001 → 0000000000000000
下ボタンは押されていなかった。pad.key[0] = 0;
次に i は 1 で mul は 2 ですから、
PadInput & mul は、0010000000000000 & 0000000000000010 → 0000000000000000
左ボタンは押されていなかった。pad.key[1] = 0;
i が 13 になった時 mul は 8192 ですから、
PadInput & mul は、0010000000000000 & 0010000000000000 → 0010000000000000
ゼロじゃない! スタートボタンは押されていた。
pad.key[13]++; で押され続けていた回数をカウントアップ。
i はボタン番号であり、
PadInput の中では、右端から何ビット目かを表し、
pad.key という配列では、何番目の要素であるかを示します。
Re: 龍神録プログラミングの館
下ボタンは 0 だから、右端から 0ビット目が 1 で 00000001、十進の 1。agunesu さんが書きました: ↑5年前すみません。後一点あるんですけどなぜ、左ボタンと右ボタンが押されたら6になるんですか?
左ボタンは 1 だから、右端から 1ビット目が 1 で 00000010、十進の 2。
右ボタンは 2 だから、右端から 2ビット目が 1 で 00000100、十進の 4。
上ボタンは 3 だから、右端から 3ビット目が 1 で 00001000、十進の 8。
左ボタンと右ボタンが同時に押されていたら
00000010 + 00000100 → 00000110。十進で 2 + 4 → 6。
Re: 龍神録プログラミングの館
#2 の私の回答を読んでいないのですか?agunesu さんが書きました: ↑5年前そのゲームパッドの値はプログラミングをしてわかるのですか?そのプログラムコードを教えてくれると幸いですm(_ _)m
そこの first_ini という関数は、
龍神録プログラミングの館の8章に書いてあるものです。
「パッドキーの何番がどこのボタンに対応するかは、実際に自分で確認して下さい。」パッドで使うキーはPAD_MAXである16個を最大数として用意し、とりあえず
「左・上・右・下・ショット・ボム・低速・スタート・変身」 の9つのキーを用意します。
それぞれのキーに0~15のどれかの数字を対応させる事で好きに設定したパッドキーを利用する事が出来ます。
パッドキーの何番がどこのボタンに対応するかは、実際に自分で確認して下さい。
こちらで確認したところ、以下に示す番号が一般的に使えるので、初期化関数でその値を代入しておきます。
--ini.cppを変更--
とあるので、GetJoypadInputState() のあとに、DrawFormatString() を追加して、
PadInput の値を表示してみれば、確認できます。
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
DrawFormatString(0, 0, GetColor(128,128,128), "PadInput = %04x", PadInput);
スタートボタンを押せば 2000 と表示されるはずです。
2進でなくて 16進ですが、2進に直すと、それぞれ
0000 0000 0000 0010、0000 1000 0000 0000、0010 0000 0000 0000
です。右端から何ビット目かでボタンの番号が分かります。