8章の「キーコンフィグに対応させてみよう」について、質問させていただきます。
void GetHitPadStateAll()の中の
mul*=2;がよくわかりません。
この一文が無いとパッドでの入力がおかしくなる、というのは実行してみてわかったのですが、
どうしてそのようになるのかが、さっぱりわかりません。
mul*=2;がよくわかりません。
先ほどはちょっと時間が無くて丁寧に答えられずごめんなさい。 もうお解かりになったかもしれませんが念のために。 コンピュータは電気が通るか通らないかでデータを識別・処理している為2進数です。 これを0(電気が通らない)か1(電気が通る)かという言い方をします。 0か1、そのどちらかの情報を保持出来る最小単位をビットといいます。 1ビットあれば2つの信号が識別出来ます。 0か1ですからね。 では、これが2つくっついて2ビットになったらいくつ信号が識別出来るでしょう。 00 01 10 11 4種類ですね。では3ビットなら? 000 001 010 011 100 101 110 111 8種類ですね。2→4→8→・・という増加の仕方はおわかりのように2の累乗です。 nビットは2のn乗通りの信号が識別出来ます。 データはビット単位で扱ってはあまりにも小さすぎるので、ある程度まとまった塊を作る事になりました。 こうして8ビットを1まとまりにしたのが1バイトです。 つまり1バイトには2の8乗つまり256種類の信号を格納する事が出来ます。 char型が何故256種類の信号を識別出来るかというと8ビットだからですよね。 int型が何種類の信号が識別できるかは環境にもよりますが、4バイトならば2の32乗通りということになります。 ここまでが前置きです。 このように、int型には32個の0か1が入る入れ物があるのです。 これをキーの入力状態に対応させてみては?と言う考え方をしたのがGetJoypadInputState関数です。 1ビット目を下キー 2ビット目を上キー 3ビット目を左キー 4ビット目を右キー という感じで各ビットに0か1を代入します。 今仮にGetJoypadInputStateは上記のような4種類のキーの入力状態を格納する関数だとします。 今PadKey変数に仮に、上下左右の4種類の入力状態が入ったとします。 今「右上」が押されているなら、2ビット目と4ビット目がたつはずですから 1010 になるはずですね?ここで、mulはどのような対応になるかみていきましょう。 mulには最初1が入っていますから ---------------------------- nビット番目 4 3 2 1 PadKey 1 0 1 0 mul 0 0 0 1 ---------------------------- こうなっているはずですね? ここで、PadKeyとmulとで論理積(両方とも1なら1,違うなら全て0をはく計算方法)で計算すると 計算結果は0になります。 今はmulが対応しているのは1ビット目だけであり、1ビット目である下キー以外の論理積は0になります。 こうして計算結果が0になったので、下キーは押されていない事がわかりました。 ではmulに2をかけてみましょう。 10進数は10を足すと繰り上がりますが、2進数は2を足すと繰り上がりますね。 例えば0に1を足すと1、さらに1をたすと10になります。以下10進数との対応をみてみましょう 0 0 1 1 2 10 3 11 4 100 5 101 6 110 7 111 8 1000 9 1001 (略 このように、なります。桁が繰り上がっているのは10進数でいう2,4,8...つまり2の累乗ですね? ということは、ビットをずらす・・つまり桁をずらすには2をかけてやればいいことになります。 では先ほどのmul=1に2をかけてみましょう。1*2は2ですから10になりますね。よって ---------------------------- nビット番目 4 3 2 1 PadKey 1 0 1 0 mul 0 0 1 0 ---------------------------- こうなります。PadKeyとmulとの今度の論理積の結果は・・? 0010となり「0ではない」数値が返ってきます。 if(PadInput & mul) pad.key++; という書き方をしていると思いますが、ifの条件は0なら偽、0以外なら真ですから、 計算結果が0じゃなかったら実行されるわけですので 今回はpad.key(どれ位キーが入力されているかカウントするもの)が加算されます。 もし今の瞬間入力されたならこれが1になります。 では、隣のビットに移動する為にまたmulに2をかけてみましょう。 ---------------------------- nビット番目 4 3 2 1 PadKey 1 0 1 0 mul 0 1 0 0 ---------------------------- 今度の計算結果は0となりますから、左キーは入力されていないことがわかります。 最後です。またmul*=2;をしてみます。 ---------------------------- nビット番目 4 3 2 1 PadKey 1 0 1 0 mul 1 0 0 0 ---------------------------- 今回の計算結果は10進数でいう8となり、0以外となりますから、if条件は真となり実行されます。 こういう計算をそこでしていました。 なかなか知らない人にはあの2~3行のコードからここまで汲み取れというのは 酷い話ですが^^; 所々龍神録の館では説明を省略しているところがありますので、 わからないことがあればまた聞いて下さい。