ページ 11

画像の表示の仕方が分かりません

Posted: 2011年4月16日(土) 20:32
by gazo
DXライブラリを使っているのですが画像の表示の順番を選択することって出来ないですかね?
具体的にはy座標が小さい順に表示したいのですがどうすればいいのか分かりません
教えてくださいお願いします

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月16日(土) 21:07
by jay
質問がやや漠然としているのでアレですが

描画する順番を変えたいという意味ならば
プログラムは基本的に上から処理されていくという決まりがあることを理解すれば大丈夫です

つまり上にかかれた描画関数から先に処理されていき、先に描画された画像の上に後に書かれた画像が乗ってしまう場合は
そのまま上に描画された画像のみが表示されます
y座標が小さいモノを「先に」描画させたいのならその描画処理を前の方で
y座標が小さいモノを「上に」描画させたい(他の画像の前に描画させるの意)のならその描画処理を後の方に

それぞれ書けばいいと思います。


時間差で描画させたいという意味だったなら
静的変数を宣言して、それが一定の値になった時のみ描画させるようにすればいいと思います。

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月16日(土) 23:01
by gazo
すいません   質問に具体性が足りませんでした
私が想像しているのは常に画像の表示順が変わって欲しいわけです
キャラクターが障害物の後ろに移動すれば当然、キャラクターが先に描画されますし
逆に障害物の前にキャラクターが移動すれば障害物が先に描画されていることになりますよね

そういうことがしたいのです
わざわざ回答していただいたのにすいません 
できれば常に画像の描画順が入れ替わる風にするには
どうすればいいかご教授いただけないでしょうか?

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月16日(土) 23:17
by softya(ソフト屋)
最近似たような回答をしました。
http://dixq.net/forum/viewtopic.php?f=3&t=8221

奥行きをCZで表現してますがyが奥行きならyを奥行きに置き換えてください。

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月16日(土) 23:47
by gazo
うぅ、馬鹿なのでよく理解できません
できることならばもう少し初心者にも分かるように
教えてくださらないでしょうか?

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月16日(土) 23:53
by softya(ソフト屋)
次の説明でわからない番号を書いてください。
①奥行き値がyならyの大きなものから描画すれば描画順番が正しくなることは理解できますか?
②yの大きなものから並べるのにソートを使います。
③キャラと障害物を識別番号で区別して指定された識別番号のものを指定座標に描画する関数は作れますか?
④xとy座標と識別番号を構造体に入れて複数の描画物分配列化して、その構造体配列をy座標順にソートして描画関数を呼ぶ処理を作れますか?

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 00:03
by gazo
③④が分かりません 
単語ごとに認識はできるのですが全く分かりません
ソートという言葉も分かりません

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 00:59
by gazo
すいません
③に関してはDXライブラリを使用すれば分かります
④とソートの意味が分かりません

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 01:11
by softya(ソフト屋)
③と④は置いておいて、ソートをまず勉強しましょう。
ソートはアルゴリズムの基本とも言うべきものでゲームで非常に重要です。

「C言語講座>アルゴリズム研究室>ソート」
http://www1.cts.ne.jp/~clab/algorithm/sort.html
「アルゴリズムとデータ構造編 トップページ」
http://www.geocities.jp/ky_webid/algorithm/index.html

とりあえずバブルソートが必要です。最低これは理解して下さい。
他のアルゴリズムもゲームで使うことがあるので時間を見ては勉強することをお勧めします。

下記の描画構造体配列データをyが大から小の順番になるようにソートしてprintfしてみてください。

コード:

//	描画構造体。
typdef struct {
	int x;			//X座標
	int y;			//Y座標
	int ImageID;	//描画物の識別ID
} DrawData_t;

//	描画構造体配列。
DrawData_t DrawData[] = {
	{ 0,1,	2},
	{ 0,9,	3},
	{ 0,7,	5},
	{ 0,10,	4},
	{ 0,3,	1},
	{ 0,2,	0},
};
すいません
③に関してはDXライブラリを使用すれば分かります
④とソートの意味が分かりません
③に関して障害物や自キャラ敵キャラが混じっても1つの関数で描画できるよう出来ますか?

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 01:31
by gazo
ゲームループの中で何度もソートを繰り返すという考えでいいでしょうか?


>③に関して障害物や自キャラ敵キャラが混じっても1つの関数で描画できるよう出来ますか?
描画関数のDrawGraphを一回だけ使って3つの画像を表示する方法は存じません
自作関数を作ってその中に収めるということならできますが・・・

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 02:17
by gazo
すいません

その問題わかりそうにもないです
だいぶ時間かけないといけませんので考えながら一度寝ます・・・

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 10:42
by softya(ソフト屋)
gazo さんが書きました:ゲームループの中で何度もソートを繰り返すという考えでいいでしょうか?
ゲームループ中で毎フレーム必ずソートしないと順番は制御できません。
gazo さんが書きました: >③に関して障害物や自キャラ敵キャラが混じっても1つの関数で描画できるよう出来ますか?
描画関数のDrawGraphを一回だけ使って3つの画像を表示する方法は存じません
自作関数を作ってその中に収めるということならできますが・・・
はい。自作関数で描画してください。

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 10:45
by Dixq (管理人)
難しく考えすぎているように思います。
softyaさんは非常に簡単なことを解りやすく教えて下さっているので、是非「難しそう」と思うこと無く考えてみてください。

問題が難しい時や複雑な時、要素が多くて考えにくい時は、問題を分解したり、簡略化したり、要素を減らしてまず考えることが多いです。
構造体のソートが難しいならまず配列で、6つの要素が多すぎるならまず3つで考えたりしてみてください。
例えば

int a[3];
a[0] = 5;
a[1] = 1;
a[2] = 2;

があった時、

for( int i=0; i<3; i++ ){
printf("%d\n", a);
}

で小さい順に表示するようにしなさいと言われたら出来ますか?

a[0] = ?;
a[1] = ?;
a[2] = ?;

出来たら次はと、分からない数値が入っても小さい順に並び替えて表示できるようにして下さい。
出来たら次は要素を3つから4つにしてみて下さい。
出来たら次は要素を6つにしてみて下さい。(この辺からソートのプログラムを理解しないと手におえなくなってくるはずです)
出来たら次は構造体にして、softyaさんが出された問題を解いてみてください。

恐らく順番にやっていけばいきなり解くよりわかりやすくなるのではないかと思います。

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 15:55
by gazo

コード:


int main()
{
	int i, j, flag;
	DrawData_t  temp;
	
	for(int k=0;k<3;k++){
		j = 0;
		do {
			flag = 0;
			for(i=0;i<3-j;i++) {
				if( *( (int *)&DrawData [i] + k) > *((int *)&DrawData[i+1] + k)) {
					temp = DrawData[i];
					DrawData[i] = DrawData[i+1];
					DrawData[i+1] = temp;
					flag = 1;
				}
			}
			j++;
		}while(flag);
	}
	return 0;
}
codeタグとインデントを修正しましました。それとループ範囲が分かりづらいので{}を追加。 by softya(ソフト屋)

うーん?

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 16:11
by softya(ソフト屋)
このコード自体は構造体を扱っているとしたら、わざわざポインタを出して難しくしていると言うか意味不明になっています。
ポインタが出てくる余地は有りませんので無しで書けます。

とりあえず、この件は置いておいてDixq (管理人)さん言われるとおりint配列をソートするプログラムを作ってみてください。
結果のprintfもお忘れなく。
これをクリアできたら、構造体配列に移りましょう。

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 19:17
by gazo
はい、言われたとおり簡単なソートからはじめて見ます

最後に2つほど質問なのですが

・関数をソートすることってできるのですか?
わたしが参考サイトをまわっていた時は構造体や配列のソートばかりで関数のソートはありませんでした

・私はゲームをつくるときに主人公の画像ならsyujinkou関数で敵の画像ならteki関数で
フィールドの画像ならfi-rudo関数で描画処理を行っていたのですが
ソートをするならgazoukanri関数をつくってそこで全ての描画処理をする方がいいのでしょうか?

お教えください

Re: 画像の表示の仕方が分かりません

Posted: 2011年4月17日(日) 19:22
by softya(ソフト屋)
gazo さんが書きました: ・関数をソートすることってできるのですか?
わたしが参考サイトをまわっていた時は構造体や配列のソートばかりで関数のソートはありませんでした
構造体に描画関数ポインタを追加してy座標共々ソートさせる方法はあります。
gazo さんが書きました: ・私はゲームをつくるときに主人公の画像ならsyujinkou関数で敵の画像ならteki関数で
フィールドの画像ならfi-rudo関数で描画処理を行っていたのですが
ソートをするならgazoukanri関数をつくってそこで全ての描画処理をする方がいいのでしょうか?
上に書いた方法でも良いですし、描画はgazoukanri()で切り分けても良いです。
ご自分の知識レベルで可能な方を選択されると良いんじゃないでしょうか。