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

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

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

#1

投稿記事 by Noob » 4年前

こんにちは、前に一度質問させてもらった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文 順番)知りたい情報と一致するサイトがありません・・・
よろしくお願いします。

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

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

#2

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

なぜProcessMessage()がこの位置に置かれているのかはわかりませんが、とりあえず
Noob さんが書きました:※私が書いて、動かなかったもの

コード:

	while((ClearDrawScreen()==0) && (ProcessMessage()==0) && (ScreenFlip()==0)){
		DrawGraph(x,100,a,TRUE);
		x=x+2;
	}
せっかく描いたものを消して、消した直後のまっさらな画面を映しても、画像は出ませんよね…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

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

#3

投稿記事 by プラム » 4年前

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ライブラリ関数リファレンスをご覧ください。

Noob

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

#4

投稿記事 by Noob » 4年前

みけCAT さんが書きました: せっかく描いたものを消して、消した直後のまっさらな画面を映しても、画像は出ませんよね…

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

Noob

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

#5

投稿記事 by Noob » 4年前

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

hide

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

#6

投稿記事 by hide » 4年前

&& で繋げた時は左から順に動きます。(細かい動作は省略して話しています)
while文だからどうとかではなくて、 && でつないだ時は全てそうなるのです。

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

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

のような感じです。

Noob

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

#7

投稿記事 by Noob » 4年前

すいません、落ち着いてみたところ理解しました・・・!
そりゃClearDrawScreenの処理したあとにScreenFlipしてもしょうがないですよね……w

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

閉鎖

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