龍神録プログラミングの館

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

龍神録プログラミングの館

#1

投稿記事 by agunesu » 5年前

龍神録プログラミングの館の8章のvoid GetHitPadStateAll関数なのですが序盤のfor文の内容が理解できません(>_<)お優しいどなたご教授願えますか?

かずま

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

#2

投稿記事 by かずま » 5年前

コード:

        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;
        }
ジョイパッドの左ボタンと右ボタンを押したとき、
PadInput には十進の 5 が入ります。これは 二進で 00000110 です。
なぜなら、次の定義により左ボタンは右から 1ビット目、右ボタンは
右から 2ビット目となるので、それらのビットが立っているのです。

コード:

//一番最初の初期化
void first_ini(){
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;

        configpad.down=0;
        configpad.left=1;
        configpad.right=2;
        configpad.up=3;
        configpad.bom=4;
        configpad.shot=5;
        configpad.slow=11;
        configpad.start=13;
        configpad.change=6;
}
for文を 16回まわると、mul の値は、1, 2, 4, 8, ... と変化し、
これは 2 進で 1, 10, 100, 1000, ...です。
PadInput と mul で &演算を行うことにより、PadInput の下位から
順番にそのビットが 0 か 1 かが分かり、pad.key に 0 か 0で
ない値を設定できます。

ビット演算を行うのだから、mul *= 2; の代わりに
mul <<= 1; とシフト演算子を使うほうが分かりやすいでしょう。

どこが分からなかったのかを教えてください。

かずま

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

#3

投稿記事 by かずま » 5年前

かずま さんが書きました:
5年前
PadInput と mul で &演算を行うことにより、PadInput の下位から
順番にそのビットが 0 か 1 かが分かり、pad.key に 0 か 0で
ない値を設定できます。

最後の部分を次のように訂正します。
pad.key[ i] に 0 か 0でない値を設定できます。

かずま

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

#4

投稿記事 by かずま » 5年前

かずま さんが書きました:
5年前
ジョイパッドの左ボタンと右ボタンを押したとき、
PadInput には十進の 5 が入ります。これは 二進で 00000110 です。
すみません。間違っています。次のように訂正します。
PadInput には十進の 6 が入ります。これは 二進で 00000110 です。

agunesu

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

#5

投稿記事 by agunesu » 5年前

とてもわかりやすい説明で助かりましたm(_ _)mご教授ありがとうございました(^_^;)

agunesu

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

#6

投稿記事 by agunesu » 5年前

やっぱりわかりません(笑)
AND演算子で比べることはわかったのですが、結局iには何の数字が入るのですか?

agunesu

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

#7

投稿記事 by agunesu » 5年前

すみません。後一点あるんですけどなぜ、左ボタンと右ボタンが押されたら6になるんですか?

かずま

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

#8

投稿記事 by かずま » 5年前

agunesu さんが書きました:
5年前
AND演算子で比べることはわかったのですが、結局iには何の数字が入るのですか?
i は 0~15 の値を取り、それはジョイパッドのボタン番号です。
下ボタンは 0、左ボタンは 1、...、スタートボタンは 13。

PadInput は int で、その下位16ビットの各ビットが 0 か 1 かで、
どのボタンが押されたのかを示します。

スタートボタンが押されたら、右から13ビット目が 1 になりますから、
二進で 0010000000000000、それは十進で 8192 です。

for (i = 0; i < 16; i++) { により、

まず i は 0 で mul は 1 ですから、
PadInput & mul は、0010000000000000 & 0000000000000001 → 0000000000000000
下ボタンは押されていなかった。pad.key[0] = 0;

次に i は 1 で mul は 2 ですから、
PadInput & mul は、0010000000000000 & 0000000000000010 → 0000000000000000
左ボタンは押されていなかった。pad.key[1] = 0;

i が 13 になった時 mul は 8192 ですから、
PadInput & mul は、0010000000000000 & 0010000000000000 → 0010000000000000
ゼロじゃない! スタートボタンは押されていた。
pad.key[13]++; で押され続けていた回数をカウントアップ。

i はボタン番号であり、
PadInput の中では、右端から何ビット目かを表し、
pad.key という配列では、何番目の要素であるかを示します。

かずま

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

#9

投稿記事 by かずま » 5年前

agunesu さんが書きました:
5年前
すみません。後一点あるんですけどなぜ、左ボタンと右ボタンが押されたら6になるんですか?
下ボタンは 0 だから、右端から 0ビット目が 1 で 00000001、十進の 1。
左ボタンは 1 だから、右端から 1ビット目が 1 で 00000010、十進の 2。
右ボタンは 2 だから、右端から 2ビット目が 1 で 00000100、十進の 4。
上ボタンは 3 だから、右端から 3ビット目が 1 で 00001000、十進の 8。

左ボタンと右ボタンが同時に押されていたら
00000010 + 00000100 → 00000110。十進で 2 + 4 → 6。

agunesu

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

#10

投稿記事 by agunesu » 5年前

そのゲームパッドの値はプログラミングをしてわかるのですか?そのプログラムコードを教えてくれると幸いですm(_ _)m

かずま

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

#11

投稿記事 by かずま » 5年前

agunesu さんが書きました:
5年前
そのゲームパッドの値はプログラミングをしてわかるのですか?そのプログラムコードを教えてくれると幸いですm(_ _)m
#2 の私の回答を読んでいないのですか?
そこの first_ini という関数は、
龍神録プログラミングの館の8章に書いてあるものです。
パッドで使うキーはPAD_MAXである16個を最大数として用意し、とりあえず

「左・上・右・下・ショット・ボム・低速・スタート・変身」 の9つのキーを用意します。

それぞれのキーに0~15のどれかの数字を対応させる事で好きに設定したパッドキーを利用する事が出来ます。

パッドキーの何番がどこのボタンに対応するかは、実際に自分で確認して下さい。

こちらで確認したところ、以下に示す番号が一般的に使えるので、初期化関数でその値を代入しておきます。

--ini.cppを変更--

コード:

#include "../include/GV.h"

//一番最初の初期化
void first_ini(){
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;

        configpad.down=0;
        configpad.left=1;
        configpad.right=2;
        configpad.up=3;
        configpad.bom=4;
        configpad.shot=5;
        configpad.slow=11;
        configpad.start=13;
        configpad.change=6;
}
「パッドキーの何番がどこのボタンに対応するかは、実際に自分で確認して下さい。」
とあるので、GetJoypadInputState() のあとに、DrawFormatString() を追加して、
PadInput の値を表示してみれば、確認できます。

コード:

		PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
		DrawFormatString(0, 0, GetColor(128,128,128), "PadInput = %04x", PadInput);
左ボタンを押せば 0002、低速ボタンを押せば 0800、
スタートボタンを押せば 2000 と表示されるはずです。
2進でなくて 16進ですが、2進に直すと、それぞれ
0000 0000 0000 0010、0000 1000 0000 0000、0010 0000 0000 0000
です。右端から何ビット目かでボタンの番号が分かります。

返信

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