合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: 焼き魚
[URL]
Date: 2017年8月11日(金) 12:49
No: 1
(OFFLINE)

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

ゲームプログラミング初心者です。
龍神録ゲームプログラミングの館を参考にしてゲームを作っていて、現在8章の「キーコンフィグに対応させてみよう」まで進めたのですが、
key.cpp内の
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//パッドとキーボードの両方の入力をチェックする関数
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文内で何をしているのかが分からず困っています。
分かる方教えていただけないでしょうか?

Name: にこよん
[URL]
初心者(6,569 ポイント)
Date: 2017年8月11日(金) 13:10
No: 2
(OFFLINE)

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

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

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

Name: 焼き魚
[URL]
Date: 2017年8月11日(金) 22:16
No: 3
(OFFLINE)

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

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

Name: Dixq (管理人)
(管理人)
[URL]
ウィザード(1,489,189 ポイント)
Date: 2017年8月12日(土) 09:13
No: 4
(OFFLINE)

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

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が入ることになるのです。

Name: 焼き魚
[URL]
Date: 2017年8月12日(土) 13:36
No: 5
(OFFLINE)

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

[解決!]

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[11人]