ページ 1 / 1
キャラを4方向に歩かせる
Posted: 2009年12月23日(水) 21:46
by kms
度々質問させて頂きます。
ゲーム基本編の22章、キャラを四方向に歩かせるという課題の、
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];
という行がなかなか理解できません。
何度かページを読んだのですが、僕の思考回路はショート寸前です。
何方かご教授頂けないでしょうか。

Re:キャラを4方向に歩かせる
Posted: 2009年12月23日(水) 22:21
by softya
まず、image[/url]配列にどの様に画像情報が格納されているか分かりますか?
image[0]なら何とか?
Re:キャラを4方向に歩かせる
Posted: 2009年12月23日(水) 22:51
by kms
お返事ありがとうございます。
image[0]の場合は、画像情報は、最初の一番目、ですよね?
[0]>[1]>[2]....という具合に。。
つまり、image[0]は、キャラクターがうえを向いている画像ですよね。
[0][1][2][3]
[4][5][6][7]
[8][9].....
といった感じでしょうか?
Re:キャラを4方向に歩かせる
Posted: 2009年12月23日(水) 23:51
by softya
では、ch.muki*4の意味は分かりますよね?
あとは、(ch.x%32+ch.y%32)/8ですが、これは[0][1][2][3]と1つの方向が4つのパターンがセットに成っているのと関係します。
4方向に歩くプログラムですのでch.xとch.yが同時変化しないのは分かりますよね?
なのでとりあえず片方のch.xだけを考えてみます。
片方だけなので(ch.x%32)/8と考えて、ch.xを32で割った余りを更に8で割るとどんな値が求まるでしょうか?
値の範囲を書いてみて下さい。
Re:キャラを4方向に歩かせる
Posted: 2009年12月24日(木) 00:38
by kms
お返事ありがとうございます。
00000000
11111111
22222222
33333333
44444444
55555555
66666666
77777777
(中略)..
3131313131313131
でしょうか?
Re:キャラを4方向に歩かせる
Posted: 2009年12月24日(木) 00:46
by softya
プログラムを作って試してみて下さい。
printf( "%d\n", (x%32)/8 );
としてxを0から128までforで回してみると分かりますよ。
Re:キャラを4方向に歩かせる
Posted: 2009年12月24日(木) 01:56
by kms
お返事遅れてしまい申し訳ありません。。
00000000111111112222222233333333....の繰り返しになったのですが。。
Re:キャラを4方向に歩かせる
Posted: 2009年12月24日(木) 08:50
by softya
今までの情報を整理してみて下さい。
>ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];
ch.muki*4の取りうる値は?
(ch.x%32+ch.y%32)/8の値の変化は?
この2つの値を組み合わせるとどうなりますか?
Re:キャラを4方向に歩かせる
Posted: 2009年12月25日(金) 17:02
by kms
お返事遅れてしまい申し訳ないです。。
えと、情報を整理したのですが、まだよくわかりません。。
xの値とyの値にそれぞれ、32の余り+8で、
>00000000111111112222222233333333....の繰り返し
になるのは感覚的にわかるのですが、それ以上は。。
ごめんなさい。。本当によくわからないのです。
Re:キャラを4方向に歩かせる
Posted: 2009年12月25日(金) 17:29
by softya
それでは、
int x,y,muki;
x=32;
y=32;
for( muki=0 ; muki<4 ; muki++ ) {
for( x=32; x<96; x+=4 ) {
printf( "muki=%d x=%d y=%d ???=%d\n", muki, x, y, (x%32+y%32)/8 + muki*4 );
}
}
というプログラムで表示される???の値の意味は理解できますか?
明らかな法則性があるのが分かると思いますが。
Re:キャラを4方向に歩かせる
Posted: 2009年12月25日(金) 18:02
by kms
mukiに応じて、???が増えていますね。。
キャラクターのmukiに応じて、キャラクターの歩く動作を表しているのでしょうか?
たとえば、mukiが0のとき(上向きのとき)、
???は、キャラクターの上向き画像を、[0][0][1][1][2][2][3][3]...
と増やしている。これにより、キャラクターが歩く動作をする。
でしょうか?
違いましたら、すみません。。
Re:キャラを4方向に歩かせる
Posted: 2009年12月25日(金) 18:32
by softya
mukiはキャラクタの向きですね。
???はmukiが0の時は0から3を繰り返しますし、mukiが1の時は4から7を繰り返しているのが分かると思います。
ここでimage配列に画像がどう格納されているか考えるとなぜ0から3や4から7を繰り返すのか見えてきませんか?
そして、x,y,mukiと画像の関係が見えてきませんか?
Re:キャラを4方向に歩かせる
Posted: 2009年12月26日(土) 17:40
by kms
>ここでimage配列に画像がどう格納されているか考えるとなぜ0から3や4から7を繰り返すのか見えてきませんか?
mukiが0のとき、0から3を繰り返すのは、
muki==0(上向き画像)を歩かせる処理をする為、としかまだわかりません。
画像を、0>1>2>3>と順番に処理する事により、テクテク、キャラクターがうえに歩くとしか。。
muki==1は、左向きの画像ですよね?
これも上記と同様、4>5>6>7と順番に処理する事により、画像をひとつひとつ更新しているんですよね?
下記の配列を画像としたとき、
[0]>[1]>[2]>[3] == muki 0
[4]>[5]>[6]>[7] == muki 1
[8]>[9]>[10]>[11] == muki 2
[12]>[13]>[14]>[15] == muki 3
という関係性は見えてきたのですが。。
すみません。まだこの段階で詰まっています。。
Re:キャラを4方向に歩かせる
Posted: 2009年12月26日(土) 21:48
by softya
>ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];
この行はキャラの向きと座標からキャラの歩行アニメの今現在の画像を求めるって事ですので、それで理解されていることにはならないんでしょうか?
何処の部分に疑問が残っているか教えてもらえますか?
Re:キャラを4方向に歩かせる
Posted: 2009年12月26日(土) 22:47
by kms
ええとですね、後々色々考えた結果なんですけど、
間違った解釈をしていました。
なにか、ピクセルを理解していなかったようです。
その後、考えた限りの解答なんですが、
(ch.x%32+ch.y%32)/8が配列の[0][1][2][3]の4ループの実現だとすると、
それに加算される、ch.muki*4は、0が0、1が4、2が8、3が12で、各キャラの向きを表しているのですよね?
そこに、+が出てきて、何がなにやら混乱している状況です。
まだ、(ch.x%32+ch.y%32)/8 と、ch.muki*4 が、
自分のなかでは独立した感じになっています。。
Re:キャラを4方向に歩かせる
Posted: 2009年12月26日(土) 23:00
by softya
画像が
[0][1][2][3] = 上向き歩行アニメ
[4][5][6][7] = 左向き歩行アニメ
[8][9][10][11] = 下向き歩行アニメ
[12][13][14][15] = 右向き歩行アニメ
だと言うことは理解されてますよね?
これを4x4の表と考えてください。
ch.muki*4は縦軸の選択をする計算です。
(ch.x%32+ch.y%32)/8は横軸の選択をする計算と言うわけです。
なので、独立しているといえば独立しています。
>なにか、ピクセルを理解していなかったようです。
ピクセルって画素の最小単位=ドットの事ですがどういう意味で使われていますか?
Re:キャラを4方向に歩かせる
Posted: 2009年12月26日(土) 23:19
by kms
>画像が
[0][1][2][3] = 上向き歩行アニメ
[4][5][6][7] = 左向き歩行アニメ
[8][9][10][11] = 下向き歩行アニメ
[12][13][14][15] = 右向き歩行アニメ
だと言うことは理解されてますよね?
はい。
>ピクセルって画素の最小単位=ドットの事ですがどういう意味で使われていますか?
最初は、32ピクセルと読んだとき、キャラクターのサイズだと勘違いしていました。
なので、もう一度、21章の「キャラを一区間歩かせる」をじっくり読んだとき、
キャラを一区間歩かせるときの、[0]>[1]>[2]>[3]の四ループで32ピクセルだと理解しました。
また誤っていたら、恐縮ですが。。。
0~7ピクセルは -> [12]
8~15ピクセルは -> [13]
16~23ピクセルは -> [14]
24~31ピクセルは -> [15]
という説明です。
今は、1ピクセルは、1ドットだと解釈しています。
Re:キャラを4方向に歩かせる
Posted: 2009年12月26日(土) 23:29
by softya
>最初は、32ピクセルと読んだとき、キャラクターのサイズだと勘違いしていました。
あぁ、分かりました。
この(ch.x%32+ch.y%32)/8に出てくる32は歩く距離(ピクセル)を表します。
キャラクタのサイズも32ピクセルなのですが、今回の式には関係ありません。
Re:キャラを4方向に歩かせる
Posted: 2009年12月26日(土) 23:42
by kms
>この(ch.x%32+ch.y%32)/8に出てくる32は歩く距離(ピクセル)を表します。
キャラクタのサイズも32ピクセルなのですが、今回の式には関係ありません。
そうだったんですか。。すみません。ずっと悩んでいました。
ありがとうございます。
ちなみに、
[0][1][2]
[3][4][5]
[6][7][8]
[9][10][11]
という配列の場合は、
式は、(ch.x%32+ch.y%32)/11 + ch.muki*3
になるのでしょうか?
何度も申し訳ありません。。

Re:キャラを4方向に歩かせる
Posted: 2009年12月27日(日) 00:40
by softya
>(ch.x%32+ch.y%32)/11 + ch.muki*3
確かにこう書くしかないのですが、1ドットづつ移動した場合に11,11,10という周期に成るので最後だけ周期が短くなります。これがアニメだと違和感になる場合があるので使ってみて違和感が無ければって事ですね。
他にもch.xやch.yを使わずにアニメーションする方法があるので場合によって式を全く変えた方がいいでしょね。その場合は歩いたフレーム数をカウントします。
Re:キャラを4方向に歩かせる
Posted: 2009年12月27日(日) 07:38
by kms
わかりました。
softya様、ご丁寧な解説、本当にありがとうございました。
ずっと悩んでいたので、助かりました。。
とりあえず、
>(ch.x%32+ch.y%32)/11 + ch.muki*3
の処理に関して、目立った違和感はありませんでした。
こんな僕の質問に応えてくださり、本当にありがとうございました。
また何かとご質問する場合もあると思いますが、
そのときは宜しくお願い致します。