ページ 11

龍神録プログラミングの館での疑問

Posted: 2017年8月11日(金) 12:49
by 焼き魚
ゲームプログラミング初心者です。
龍神録ゲームプログラミングの館を参考にしてゲームを作っていて、現在8章の「キーコンフィグに対応させてみよう」まで進めたのですが、
key.cpp内の

コード:

//パッドとキーボードの両方の入力をチェックする関数
void GetHitPadStateAll(){
        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;
        }
        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));
}
この関数の変数mulや、for文内で何をしているのかが分からず困っています。
分かる方教えていただけないでしょうか?

Re: 龍神録プログラミングの館での疑問

Posted: 2017年8月11日(金) 13:10
by にこよん
forはパッドのボタンの分の16回ループしているのではないでしょうか?

mulは↓のサイトの
http://www.c-lang.org/operator.html
ビット演算子あたりを読めばわかるのではないでしょうか?

Re: 龍神録プログラミングの館での疑問

Posted: 2017年8月11日(金) 22:16
by 焼き魚
リンクを貼っていただいたサイトで、PadInputとmulをビット演算で積を取っていることは理解できたのですが、
なぜPadInputとmulのビット積でif文を使い条件分けするのでしょうか?

Re: 龍神録プログラミングの館での疑問

Posted: 2017年8月12日(土) 09:13
by Dixq (管理人)
GetJoypadInputStateで取れてくる値は「ビットアサイン」となります。
例えば1バイトの変数は8bitで出来ていますから、bitの様子を0,1で表現すると
00000000
という形になります。
0bit目が0ならボタン1が押されていない、1ならボタン1が押されている、
1bit目が0ならボタン2が押されていない、1ならボタン2が押されている。。。
といった具合に各位置のbitの0,1が多数のボタンに対応しています。
また、論理積とは入力が二つとも1の時だけ1を出力する計算方法です。
0と0は0
1と0は0
0と1は0
1と1は1
です。従って、例えば3bit目を取り出したい時は
if(何か & 00001000)
を計算すれば「何か」から3bit目のみ0か1を取り出せることになります。
取り出した結果が0であれば入力していない、0以外であれば入力していることを意味します。
mul *= 2;
は1bitずつずらしている作業と同義なので、16回ループすることで
1bitごと16回ずらしながら各ボタンの入力状態を見て、if文に応じてpad.keyにボタンが押されている場合は++;、押されていない場合は0が入ることになるのです。

Re: 龍神録プログラミングの館での疑問

Posted: 2017年8月12日(土) 13:36
by 焼き魚
なるほど!GetJoupadInputSiteの返り値についてあまり理解できていませんでした。
mulはビットごとの判定につかっていたのですね。
とても分かりやすい解説ですっきりしました。
にこよんさん、Dixqさんありがとうございました。