館8章において

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

館8章において

#1

投稿記事 by yusha » 11年前

「ch.img+=4*2;」という書き方でなぜ「画像を左向きに」ということになるのですか??

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 館8章において

#2

投稿記事 by みけCAT » 11年前

龍神録プログラミングの館の8章に「ch.img+=4*2;」という記述は見当たらないのですが、
9章の間違いもしくは別のサイトですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 館8章において

#3

投稿記事 by みけCAT » 11年前

龍神録プログラミングの館9章の話であると仮定すると、
「ch.img+=4*2;」という書き方だけでは「画像を左向きに」という意味はありません。
calc_ch関数内でch.imgが0~3のいずれかに設定され、
img_ch[0][8~11]にたまたま左向きの画像を示すハンドルが格納されているので、
結果的にgraph_ch関数で描画される画像が左向きのものになります。
オフトピック
これを書くために龍神録プログラミングの館で配布されているソースコードを見て思ったのですが、
・なぜgraph_ch()が他の自機系の関数があるchar.cppにまとまっていないのか。
・ch_move()はcalc_ch()と独立させるべきではないのではないか。
 この実装だと、ch_move()とcalc_ch()を呼ぶ順番を逆にするとこの「ch.img+=4*2;」という処理が効かなくなってしまう。
 例えば、calc_ch関数からmove_ch関数とanim_ch関数を呼び出す実装にする方がいいかもしれない。
・ch_move()とcalc_ch()でchの位置が違うのも気になる。

まあ、龍神録(略)館の設計はあまり良くないというのは前から言われていますし、
もちろん今更修正する必要もないですが…。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yusha

Re: 館8章において

#4

投稿記事 by yusha » 11年前

そうです。9章でした。

「ch.img+=4*2;」そもそもこれに「4*2」がどう関係しているのかがよくわかりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#5

投稿記事 by softya(ソフト屋) » 11年前

この理解のためには、そもそもch.imgのメンバ変数imgの役割が理解できていないといけません。
どの程度理解されていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#6

投稿記事 by yusha » 11年前

どう言ったらいいのかわかりませんが、画像制御のやつだと思ってます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#7

投稿記事 by softya(ソフト屋) » 11年前

yusha さんが書きました:どう言ったらいいのかわかりませんが、画像制御のやつだと思ってます。
そこを理解しないといけないのですよね。値が0のときと9の時だと何が違うのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#8

投稿記事 by yusha » 11年前

すいません。よくわかりません。

コードを書き換えてみたら各数字に応じて表示の変化は見られましたが、どうしてかはよくわかりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#9

投稿記事 by softya(ソフト屋) » 11年前

どちらかと言うとゲームプログラミングの館の方をちゃんと先に学習された方が良い気がします。
http://dixq.net/g/
こっちが入門編なので、龍神録は応用編となりますから。
まぁ逆に龍神録より高度な部分もあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#10

投稿記事 by yusha » 11年前

一通りみたつもりなんですが、今回の件に関するようなものは無いように思うのですが、ありましたか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#11

投稿記事 by softya(ソフト屋) » 11年前

これですね。
「4.1 画像を分割してロードする」
http://dixq.net/g/04_01.html
あと旧館の
「22. キャラを4方向に歩かせる。」
http://dixq.net/g/24.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#12

投稿記事 by yusha » 11年前

見てみたのですが、今回の件に関しては結局よくわかりませんでした。キーが押されている間は代入された数字の画像ハンドルのものを描写してるということなのでしょうか??

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#13

投稿記事 by softya(ソフト屋) » 11年前

> 見てみたのですが、今回の件に関しては結局よくわかりませんでした。キーが押されている間は代入された数字の画像ハンドルのものを描写してるということなのでしょうか??

「代入された数字の画像ハンドルのものを描写してる」の部分が分かっているのか分かっていないのか少々不安です。
1.ch.imgは配列の添字として使われているのは分かりますか?
2.そして配列には何がどんな順番で格納されているでしょうか?

> そこを理解しないといけないのですよね。値が0のときと9の時だと何が違うのでしょうか?

の部分を分かってもらいたいのですが、そこは分かったのですか?
龍神録を含めDXライブラリだとLoadDivGraphに利用は重要ポイントなのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#14

投稿記事 by yusha » 11年前

>「代入された数字の画像ハンドルのものを描写してる」の部分が分かっているのか分かっていないのか少々不安です。
1.ch.imgは配列の添字として使われているのは分かりますか?
2.そして配列には何がどんな順番で格納されているでしょうか?

1.わかってると思います。
2.「0.png」の各画像が左上を0として右に順に格納されていると思ってます。

>そこを理解しないといけないのですよね。値が0のときと9の時だと何が違うのでしょうか?

よくわかりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#15

投稿記事 by softya(ソフト屋) » 11年前

じゃあ、確認します。
1.0.pngの画像ですが実際に画像ビューアなどでどう並んでいるか確認されていますか?
2.LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;の 4 , 3の意図を想像してみて書いてください。
3.1.2.を答えた上で改めて聞きますが、0や9の数値の意味は何でしょうか?
よく分からない場合は、別プログラムを作って img_ch[0]が保持する全画像を表示するプログラムを作成してみてください。

※ 色々と私が書いているのは理解するためのアプローチ方法を提示しています。つまり本当に理解するために必要で他の場面でも使える汎用的な方法です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 館8章において

#16

投稿記事 by Dixq (管理人) » 11年前


yusha

Re: 館8章において

#17

投稿記事 by yusha » 11年前

1.確認しました。縦×横=3×4で表示されていました。

2.移動している向きに応じての横列が3段あるということでしょうか?

3.作成したのですがよくわかりません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#18

投稿記事 by softya(ソフト屋) » 11年前

2.そうです。向きに応じて3段ありますね。じゃあ、4列は何のためにあるか理解されていますか?

3.ゲームプログラミングの館のアレンジで出来ませんか? 何がどう分からないか、もう少し具体的にお願いします。
アレンジを作れないというのは、根本的に理解出ていないと言うことで、龍神録の理解も困難だと言うことですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#19

投稿記事 by yusha » 11年前

2.マントの変化ぐらいしか見受けられません。

3.画像をすべて表示することろまではできました。ですが、「ch.img+=」に続けて0や9、その他の数字を代入しても実行結果の変化は見られてもどうしてそのようになるのか理解できません。それこそ0を代入したときには向きの変化はなく移動するし、9を代入したときには向きを変化して移動はするもののキャラが点滅してるし・・・。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 館8章において

#20

投稿記事 by みけCAT » 11年前

yusha さんが書きました:9を代入したときには向きを変化して移動はするもののキャラが点滅してるし・・・。
9を代入したときは、起こるべきではないことが起こっています。
それは何でしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yusha

Re: 館8章において

#21

投稿記事 by yusha » 11年前

画像を制御しきれてない(?)から点滅してるということですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#22

投稿記事 by softya(ソフト屋) » 11年前

9を代入したときに点滅するソースコードを提示してくださいね。そのほうが話が早いです。
3.画像をすべて表示することろまではできました。のソースコードも見せて欲しいです。

>画像を制御しきれてない(?)から点滅してるということですか?

よく分かっていない部分がある証拠ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#23

投稿記事 by yusha » 11年前

基盤の数値を9に変更しただけですが。

コード:

#include "DxLib.h"
void calc_ch(){
	ch.cnt++;
	ch.img = (ch.cnt % 24) / 6;
}

void ch_move(){
	int i, sayu_flag, joge_flag = 0;
	double x, y, mx, my, naname = 1;
	double move_x[4] = { -4.0, 4.0, 0, 0 }, move_y[4] = { 0, 0, 4.0, -4.0 };
	int inputpad[4];
	inputpad[0] = CheckStatePad(configpad.left); inputpad[1] = CheckStatePad(configpad.right);
	inputpad[2] = CheckStatePad(configpad.down); inputpad[3] = CheckStatePad(configpad.up);

	if (CheckStatePad(configpad.left)>0)
		ch.img += 9;
	else if (CheckStatePad(configpad.right)>0)
		ch.img += 4 * 1;

	for (i = 0; i<2; i++)
	if (inputpad[i]>0)
		sayu_flag = 1;
	for (i = 2; i<4; i++)
	if (inputpad[i]>0)
		joge_flag = 1;
	if (sayu_flag == 1 && joge_flag == 1)
		naname = sqrt(2.0);

	for (int i = 0; i<4; i++){
		if (inputpad[i]>0){
			x = ch.x, y = ch.y;
			mx = move_x[i];   my = move_y[i];
			if (CheckStatePad(configpad.slow)>0){
				mx = move_x[i] / 3; my = move_y[i] / 3;
			}
			x += mx / naname, y += my / naname;
			if (!(x<10 || x>FIELD_MAX_X - 10 || y<5 || y>FIELD_MAX_Y - 5)){
				ch.x = x, ch.y = y;
			}
		}
	}
}

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); 

	int Image[12];
	LoadDivGraph("../dat/img/char/0.png", 12, 4, 4, 32, 32, Image);

	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()){

		DrawGraph(0, 0, Image[0], TRUE);
		DrawGraph(50, 0, Image[1], TRUE);
		DrawGraph(100, 0, Image[2], TRUE);
		DrawGraph(150, 0, Image[3], TRUE);
		DrawGraph(0, 50, Image[4], TRUE);
		DrawGraph(50, 50, Image[5], TRUE);
		DrawGraph(100, 50, Image[6], TRUE);
		DrawGraph(150, 50, Image[7], TRUE);
		DrawGraph(0, 100, Image[8], TRUE);
		DrawGraph(50, 100, Image[9], TRUE);
		DrawGraph(100, 100, Image[10], TRUE);
		DrawGraph(150, 100, Image[11], TRUE);
		DrawGraph(0, 150, Image[12], TRUE);
		DrawGraph(50, 150, Image[13], TRUE);
	}

	DxLib_End();
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#24

投稿記事 by softya(ソフト屋) » 11年前

1番めのプログラムでは、
>それこそ0を代入したときには向きの変化はなく移動するし、9を代入したときには向きを変化して移動はするもののキャラが点滅してるし・・・。
代入と書いてますが、ch.img += 9;は加算代入ですよね。加算代入とただの代入は全然違います。プログラミングにおいては言葉は正確に使いましょう。
ch.img += 9;とした場合、ch.img の値は幾つになるか想像できていますでしょうか? 書いてみてくださいね。

2番めのプログラムは、色々とマズイですね。
配列がnt Image[12];でLoadDivGraph("../dat/img/char/0.png", 12, 4, 4, 32, 32, Image);ですから、どちらも12個の要素を示しています。
配列の添字は0から始まりますので12個なら11が最大値です。
なので、
DrawGraph(0, 150, Image[12], TRUE);
DrawGraph(50, 150, Image[13], TRUE);
この2つはエラーメッセージが出てないにしても論理的にエラー=バグです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#25

投稿記事 by yusha » 11年前

1.「ch.img」は(ch.cnt % 24) / 6の値ということですか??

2.すいません。これは素でミスりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#26

投稿記事 by softya(ソフト屋) » 11年前

yusha さんが書きました:1.「ch.img」は(ch.cnt % 24) / 6の値ということですか??
それも含めて考えないといけませんね。
yusha さんが書きました: 2.すいません。これは素でミスりました。
謝ることはないですが、配列がちゃんと理解できていないのでは?と言う疑問です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#27

投稿記事 by yusha » 11年前

1.すいません。書き方をミスった気がします。実際言いたかったのは(ch.cnt % 24) / 6に9を加算した数値と考えています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#28

投稿記事 by softya(ソフト屋) » 11年前

yusha さんが書きました:1.すいません。書き方をミスった気がします。実際言いたかったのは(ch.cnt % 24) / 6に9を加算した数値と考えています。
それだと値は何になりますか? そんなに多くないので全部書き出せるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#29

投稿記事 by yusha » 11年前

9→10→11→12→9→10→11→12・・・という数をループしています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#30

投稿記事 by softya(ソフト屋) » 11年前

> 9→10→11→12→9→10→11→12・・・という数をループしています。
そうですね。であれば12だと表示はどうなりますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#31

投稿記事 by yusha » 11年前

12であれば、画像ファイルに本来あるはずのないものを読み込もうとした結果何もないので描写することはできず、結果そのフレームの間は何も表示されません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#32

投稿記事 by softya(ソフト屋) » 11年前

yusha さんが書きました:12であれば、画像ファイルに本来あるはずのないものを読み込もうとした結果何もないので描写することはできず、結果そのフレームの間は何も表示されません。
そうですね。点滅する結果と一致しますね。
つまり、そういうバグを作った訳です。

私の書いたのは9の値ならどうなりますか?って書いたので、それを9の加算に変えたのはyushaさんですよね。
これでアレンジしようと思っても、よく分かっていないとバグを簡単に入れ込めることが分かると思います。

さて、最初の質問に立ち返って見て下さい。「ch.img+=4*2;」は理解は出来たでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#33

投稿記事 by yusha » 11年前

8,9,10,11をループするということですよね?
となるとまた些細な疑問が生まれたのですが、なぜ8と書かずにわざわざ4*2と書くのでしょうか??

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#34

投稿記事 by softya(ソフト屋) » 11年前

どちらが論理的な意味で分かりやすいと思いますか?
ただ8の場合と4*2で何が違うのでしょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 525
登録日時: 12年前

Re: 館8章において

#35

投稿記事 by Rittai_3D » 11年前

ソースコード内にいきなり8と書かれていたら「なんだこの8は?」となりますよね。
4*2とあると「なるほど、横に4つの画像があって上から2番目の行をループするんだな」とわかりやすいからだと思います。
オフトピック

コード:

#define IMG_YOKO_MUM 4 // 横の画像数
enum eDir // キャラクタの向き
{
    eFRONT, eRIGHT, eLEFT,
};
int nowDir = eFRONT; // 現在の向き
// 略
ch.img += IMG_YOKO_NUM * nowDir; // ch.img = 4*2を読みやすく(?)してみた
それでもわかりづらいので、自分はこういう感じで書きますけど。
初心者です

yusha

Re: 館8章において

#36

投稿記事 by yusha » 11年前

4*2の方がわかりやすいかもしれません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#37

投稿記事 by softya(ソフト屋) » 11年前

yusha さんが書きました:4*2の方がわかりやすいかもしれません。
分かりやすればバグが減りますね。つまり自分の為になります。
他の人に見せるコードなら当然考慮すべき事になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#38

投稿記事 by yusha » 11年前

最後に一つそれてしまいますが質問させてください。

コード:

double x, y, mx, my, naname = 1;
のところでなぜ=0ではなく=1なのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#39

投稿記事 by softya(ソフト屋) » 11年前

0にしてみれば分かります。
それとnaname を詳細に解説できるなら0を初期値にしなかった理由が分かっているはずです。
つまり、naname が何かわかっていないのだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#40

投稿記事 by yusha » 11年前

0にしたら斜め移動はできますが上下左右移動はできなくなりました。また、数を2,3,4,5・・・としていったら移動はできるものの移動速度が落ちました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館8章において

#41

投稿記事 by softya(ソフト屋) » 11年前

この質問は8章ですので、9章のnaname は別トピックでお願いします。
少なくともベクトルと三角関数の理解は必要です。ゲームプログラミングの館にあるので読んでおいて下さいね。
まぁ、三角関数を知らなくても図を描いて定規で測れば感覚的に分かるんですけどね。

※ ちょと忙しいのしばらくで返事はできません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館8章において

#42

投稿記事 by yusha » 11年前

わかりました。別トピを立てて質問させていただきます。

今回の件に関して本当にありがとうございました。

閉鎖

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