龍神録プログラミングの館8章k

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

龍神録プログラミングの館8章k

#1

投稿記事 by k » 17年前

龍神録プログラミングの館で勉強しています。

8章の「キーコンフィグに対応させてみよう」について、質問させていただきます。

void GetHitPadStateAll()の中の
mul*=2;
がよくわかりません。

この一文が無いとパッドでの入力がおかしくなる、というのは実行してみてわかったのですが、
どうしてそのようになるのかが、さっぱりわかりません。

array

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

#2

投稿記事 by array » 17年前

私も、キー入力などの入力処理については理解してないので間違ってるかもしれません。

上手く書けませんが、パッド入力の際、調べたいキーと入力の&(アンド)を取ってあげる事で、入力状態が分かります

なのでmul*=2とすることでforのループ分各ボタンの状態を検知しているんだと思います。


分からない場合は、本家のリファレンスでGetJoypadInputStateについて調べて自分で理解した方が良さそうです。

array

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

#3

投稿記事 by array » 17年前

ようするに
 mul*=2;
がないと、
 for(i=0;i<16;i++)
を使って各入力状態を見たいのにmul=1の状態しか見てませんよ。って感じです。

管理人

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

#4

投稿記事 by 管理人 » 17年前

こっちの書き方の方がわかりやすいかな?と思ったんですが、素直にビットシフトしたほうがよかったかもしれません・・。
ビットシフトはご存知でしょうか?

また、キーの入力状態がどうなっているかは、本家リファレンスで一度確認して下さい。
そうすれば意味が解ると思います。
2進数であるので2をかけることで、各ビットがたっているかどうかを1つずつチェックしているのです。

k

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

#5

投稿記事 by k » 17年前

ありがとうございます。
少しですがわかってきました。

この場合は
int GetJoypadInputState()が返す値は、各ビットが各ボタンに対応している。
パッドの入力状態を取得した変数PadInput と
ビットごとの論理積を計算したい値(つまり各ビット・つまり各ボタンに対応した数値)が1,2,4,8,16…
(論理積の結果が0でなければ、入力されている)

なのでmul*=2としている、ということでしょうか。



ビットシフトについては殆ど理解していません。
nビット左にシフトすると、その結果は2のn乗を乗算した値になる(?)だったでしょうか。
使い方はよくわかっていません。


また、ちょっとした疑問ですが、mulは何かの英単語の略でしょうか。
このような場合に使う一般的な単語なのでしょうか。
教えていただければうれしいです。

バグ

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

#6

投稿記事 by バグ » 17年前

乗算(Multiplication)の事ですね。
一般的かどうかは分かりませんが…
私の場合、加算はAdd、減算はSub、除算はDivなんかを使ったりする事はあります。

k

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

#7

投稿記事 by k » 17年前

ありがとうございます。
なるほど、乗算の略だったのですね。

関数の使い方も、試してみてだいたい分かってきました。
GetJoypadInputState()は便利に作られているんですね。
調べれば調べるほどDXライブラリの凄さが見えてくるような感じがします。

管理人

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

#8

投稿記事 by 管理人 » 17年前

先ほどはちょっと時間が無くて丁寧に答えられずごめんなさい。
もうお解かりになったかもしれませんが念のために。

コンピュータは電気が通るか通らないかでデータを識別・処理している為2進数です。
これを0(電気が通らない)か1(電気が通る)かという言い方をします。
0か1、そのどちらかの情報を保持出来る最小単位をビットといいます。
1ビットあれば2つの信号が識別出来ます。
0か1ですからね。

では、これが2つくっついて2ビットになったらいくつ信号が識別出来るでしょう。

00
01
10
11

4種類ですね。では3ビットなら?

000
001
010
011
100
101
110
111

8種類ですね。2→4→8→・・という増加の仕方はおわかりのように2の累乗です。
nビットは2のn乗通りの信号が識別出来ます。

データはビット単位で扱ってはあまりにも小さすぎるので、ある程度まとまった塊を作る事になりました。
こうして8ビットを1まとまりにしたのが1バイトです。
つまり1バイトには2の8乗つまり256種類の信号を格納する事が出来ます。

char型が何故256種類の信号を識別出来るかというと8ビットだからですよね。
int型が何種類の信号が識別できるかは環境にもよりますが、4バイトならば2の32乗通りということになります。

ここまでが前置きです。

このように、int型には32個の0か1が入る入れ物があるのです。
これをキーの入力状態に対応させてみては?と言う考え方をしたのがGetJoypadInputState関数です。

1ビット目を下キー
2ビット目を上キー
3ビット目を左キー
4ビット目を右キー

という感じで各ビットに0か1を代入します。

今仮にGetJoypadInputStateは上記のような4種類のキーの入力状態を格納する関数だとします。
今PadKey変数に仮に、上下左右の4種類の入力状態が入ったとします。

今「右上」が押されているなら、2ビット目と4ビット目がたつはずですから

1010

になるはずですね?ここで、mulはどのような対応になるかみていきましょう。
mulには最初1が入っていますから

----------------------------
nビット番目 4    3    2    1

PadKey      1    0    1    0
mul         0    0    0    1
----------------------------


こうなっているはずですね?
ここで、PadKeyとmulとで論理積(両方とも1なら1,違うなら全て0をはく計算方法)で計算すると
計算結果は0になります。

今はmulが対応しているのは1ビット目だけであり、1ビット目である下キー以外の論理積は0になります。
こうして計算結果が0になったので、下キーは押されていない事がわかりました。
ではmulに2をかけてみましょう。

10進数は10を足すと繰り上がりますが、2進数は2を足すと繰り上がりますね。
例えば0に1を足すと1、さらに1をたすと10になります。以下10進数との対応をみてみましょう

0    0
1    1
2   10
3   11
4  100
5  101
6  110
7  111
8 1000
9 1001
(略

このように、なります。桁が繰り上がっているのは10進数でいう2,4,8...つまり2の累乗ですね?
ということは、ビットをずらす・・つまり桁をずらすには2をかけてやればいいことになります。

では先ほどのmul=1に2をかけてみましょう。1*2は2ですから10になりますね。よって

----------------------------
nビット番目 4    3    2    1

PadKey      1    0    1    0
mul         0    0    1    0
----------------------------

こうなります。PadKeyとmulとの今度の論理積の結果は・・?
0010となり「0ではない」数値が返ってきます。

if(PadInput & mul)  pad.key++;

という書き方をしていると思いますが、ifの条件は0なら偽、0以外なら真ですから、
計算結果が0じゃなかったら実行されるわけですので
今回はpad.key(どれ位キーが入力されているかカウントするもの)が加算されます。
もし今の瞬間入力されたならこれが1になります。

では、隣のビットに移動する為にまたmulに2をかけてみましょう。

----------------------------
nビット番目 4    3    2    1

PadKey      1    0    1    0
mul         0    1    0    0
----------------------------

今度の計算結果は0となりますから、左キーは入力されていないことがわかります。
最後です。またmul*=2;をしてみます。


----------------------------
nビット番目 4    3    2    1

PadKey      1    0    1    0
mul         1    0    0    0
----------------------------

今回の計算結果は10進数でいう8となり、0以外となりますから、if条件は真となり実行されます。

こういう計算をそこでしていました。
なかなか知らない人にはあの2~3行のコードからここまで汲み取れというのは
酷い話ですが^^;
所々龍神録の館では説明を省略しているところがありますので、
わからないことがあればまた聞いて下さい。

閉鎖

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