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

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 龍神録プログラミングの館での疑問

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

#5

by 焼き魚 » 8年前

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

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

#4

by Dixq (管理人) » 8年前

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

#3

by 焼き魚 » 8年前

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

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

#2

by にこよん » 8年前

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

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

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

#1

by 焼き魚 » 8年前

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

ページトップ