ページ 11

新・C言語「~ゲームプログラミングの館~」の1.8章のことで質問があります。

Posted: 2016年6月27日(月) 23:40
by Noob
こんにちは、前に一度質問させてもらったNoobと申します。
http://dixq.net/g/01_08.html のページで質問があるのでトピックを立てさせていただきました。
ここではプログラムの短縮として、
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

DrawGraph( x, 100, Handle, TRUE ); //画像の描画
x = x + 2; // xを2増やす

}
と記述されているのですが、ここでのwhile文の中身の順番を入れ替えると、プログラムが正しく動かず、画像がここでのサイトの例のように動きません・・・

※私が書いて、動かなかったもの

コード:

	while((ClearDrawScreen()==0) && (ProcessMessage()==0) && (ScreenFlip()==0)){
		DrawGraph(x,100,a,TRUE);
		x=x+2;
	}
なぜここのwhile文はこのような順番になるのでしょうか?

Googleで調べても、検索ワードが悪いのか(while文 順番)知りたい情報と一致するサイトがありません・・・
よろしくお願いします。

Re: 新・C言語「~ゲームプログラミングの館~」の1.8章のことで質問があります。

Posted: 2016年6月28日(火) 00:25
by みけCAT
なぜProcessMessage()がこの位置に置かれているのかはわかりませんが、とりあえず
Noob さんが書きました:※私が書いて、動かなかったもの

コード:

	while((ClearDrawScreen()==0) && (ProcessMessage()==0) && (ScreenFlip()==0)){
		DrawGraph(x,100,a,TRUE);
		x=x+2;
	}
せっかく描いたものを消して、消した直後のまっさらな画面を映しても、画像は出ませんよね…

Re: 新・C言語「~ゲームプログラミングの館~」の1.8章のことで質問があります。

Posted: 2016年6月28日(火) 20:26
by プラム
quote="Noob" id=3,18139,138649]
※私が書いて、動かなかったもの

コード:

	while((ClearDrawScreen()==0) && (ProcessMessage()==0) && (ScreenFlip()==0)){
		DrawGraph(x,100,a,TRUE);
		x=x+2;
	}
[/quote]

関数の意味をいまいち理解していないようですね。
ClearDrawScreen(); ←これは画面に書いたものを消す関数です。
ProcessMessage(); //そしてこれはDXライブラリの心臓ですね。ウィンドウズからのメッセージを処理して、システムやプロセスを動かしている関数です。
ScreenFlip(); //これは、裏画面に描画したものを表画面に反映させる処理です。

先にClearDrawScreen()を実行してしまうと。せっかく画面に描画した情報を削除してしまって、それからScreenFlip()で裏画面に書いた情報を反映しても、ClearDrawScreen()で裏画面情報も消してしまってますので、もう裏画面には何も残ってませんよね。その結果、思った通りに表示されなくなるんだと思います。

それと、これはDXライブラリの関数なので、Whileとはあまり関係ありません。

詳しくは。DXライブラリ関数リファレンスをご覧ください。

Re: 新・C言語「~ゲームプログラミングの館~」の1.8章のことで質問があります。

Posted: 2016年6月29日(水) 00:06
by Noob
みけCAT さんが書きました: せっかく描いたものを消して、消した直後のまっさらな画面を映しても、画像は出ませんよね…

なぜ、そういう処理の順番になるとわかるのでしょうか?
ごく基本的なC言語のことのみしか勉強していないので、そこのあたりの処理の順番が理解できません・・・
私は、まず「ClearDrawScreen()==0 && ProcessMessage()==0 && ScreenFlip()==0」が成り立つときに、「DrawGraphされるのを繰り返す」ものだと思っていて、条件式が「ProcessMessage()==0 && ClearDrawScrenn() ==0 && ScreenFlip()==0」だろうと、「ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0」だろうと全く同じことであると思っていたのですが、違うのですか?
while文の条件式の順番ってどういうふうに処理されているんですか???

Re: 新・C言語「~ゲームプログラミングの館~」の1.8章のことで質問があります。

Posted: 2016年6月29日(水) 00:10
by Noob
ノウル さんが書きました:quote="Noob" id=3,18139,138649]
先にClearDrawScreen()を実行してしまうと。せっかく画面に描画した情報を削除してしまって、それからScreenFlip()で裏画面に書いた情報を反映しても、ClearDrawScreen()で裏画面情報も消してしまってますので、もう裏画面には何も残ってませんよね。その結果、思った通りに表示されなくなるんだと思います。
先にClearDrawScreen() を実行してしまうとは、どういう意味でしょうか?
もともと、なぜこのプログラムはこう短縮できるかがわからないので、そこを重点的に教えていただけると助かります・・・!

Re: 新・C言語「~ゲームプログラミングの館~」の1.8章のことで質問があります。

Posted: 2016年6月29日(水) 00:48
by hide
&& で繋げた時は左から順に動きます。(細かい動作は省略して話しています)
while文だからどうとかではなくて、 && でつないだ時は全てそうなるのです。

while文の () の部分の内側の
ClearDrawScreen()==0 && ProcessMessage()==0 && ScreenFlip()==0 は条件を書いているように見えますが、実際は

1. ClearDrawScreen を実行
2. ClearDrawScreen の戻り値が0だったら ProcessMessageを実行
3. ProcessMessage の戻り値が0だったら ScreenFlipを実行
4. ScreenFripの戻り値も0だったらwhile文の {} の内側を実行

のような感じです。

Re: 新・C言語「~ゲームプログラミングの館~」の1.8章のことで質問があります。

Posted: 2016年6月29日(水) 18:41
by Noob
すいません、落ち着いてみたところ理解しました・・・!
そりゃClearDrawScreenの処理したあとにScreenFlipしてもしょうがないですよね……w

こんな初心者にみなさん、ありがとうございました。