ページ 1 / 1
新・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
こんな初心者にみなさん、ありがとうございました。