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

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

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

#1

投稿記事 by 焼き魚 » 6年前

ゲームプログラミング初心者です。
龍神録ゲームプログラミングの館を参考にしてゲームを作っていて、現在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文内で何をしているのかが分からず困っています。
分かる方教えていただけないでしょうか?

アバター
にこよん
記事: 113
登録日時: 7年前
住所: 大阪府
連絡を取る:

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

#2

投稿記事 by にこよん » 6年前

forはパッドのボタンの分の16回ループしているのではないでしょうか?

mulは↓のサイトの
http://www.c-lang.org/operator.html
ビット演算子あたりを読めばわかるのではないでしょうか?
最近は東方風アクションゲームを少しずつ作ってる人です
東方翠風燐FreeDownload⇒http://dxlib.o.oo7.jp/cgi/patio/read.cgi?no=212

焼き魚

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

#3

投稿記事 by 焼き魚 » 6年前

リンクを貼っていただいたサイトで、PadInputとmulをビット演算で積を取っていることは理解できたのですが、
なぜPadInputとmulのビット積でif文を使い条件分けするのでしょうか?

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

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

#4

投稿記事 by Dixq (管理人) » 6年前

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: 龍神録プログラミングの館での疑問

#5

投稿記事 by 焼き魚 » 6年前

なるほど!GetJoupadInputSiteの返り値についてあまり理解できていませんでした。
mulはビットごとの判定につかっていたのですね。
とても分かりやすい解説ですっきりしました。
にこよんさん、Dixqさんありがとうございました。

返信

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