ゲームプログラミングの館の12節の、「画像を動かす。」でサンプルプログラムをそのままコピーしたのですが、
実行すると、しばらく何も起きず突然完全に動いた後の画像が表示されてしまいます。(分かり難くてすみません)
13節では問題なく動いたので、sleep関数が原因だと思うのですが、理由がまったくわかりません。
なぜでしょうか?
ゲームプログラミングの館の12節について
Re:ゲームプログラミングの館の12節について
12章は「うまく表示できない例」を見せる為の章で、
なぜ13章のようなプログラムを書かないといけないか理解する為の章です。
「12章ではうまくいかないのに13章だとうまくいく」と思って頂けたなら
13章のプログラムのありがたみがわかって頂けたかと思います。
画面にうつす内容をモニタの書き換えのタイミングを無視して書き換えようとすると、うまくいかないのです。
そのタイミングは使っている人のモニタによって様々で、60Hzのモニタを使っている人もいれば
70や80Hzのモニタを使っている人もいます。
そこで裏画面処理といって、計算途中は描画されている表画面には反映せず、
裏画面で全て計算してしまってから、モニタのリフレッシュに合わせて表示内容を更新しよう!という試みが必要なのです。
13章のプログラムはうまくいきましたよね?
ゲームを製作される時は、13章のプログラムをお使いください。
モニタのリフレッシュはだいたい60が一般的じゃないかと思いますが、モニタが対応していれば簡単に変更可能です。
もしVistaなら
デスクトップ右クリック>画面の設定>詳細設定>モニタ
で変更可能です。XPでも同じような手順で出来ます。
もしゲームのFPSを一定にたもつ処理をしなければ、
このリフレッシュを早くすればゲームの進行も早くなってしまうので気をつけてください。(時間を計って移動制御しているようなプログラムではおきませんが、ループ回数のカウンタを使っているような場合速さが変化します)
なぜ13章のようなプログラムを書かないといけないか理解する為の章です。
「12章ではうまくいかないのに13章だとうまくいく」と思って頂けたなら
13章のプログラムのありがたみがわかって頂けたかと思います。
画面にうつす内容をモニタの書き換えのタイミングを無視して書き換えようとすると、うまくいかないのです。
そのタイミングは使っている人のモニタによって様々で、60Hzのモニタを使っている人もいれば
70や80Hzのモニタを使っている人もいます。
そこで裏画面処理といって、計算途中は描画されている表画面には反映せず、
裏画面で全て計算してしまってから、モニタのリフレッシュに合わせて表示内容を更新しよう!という試みが必要なのです。
13章のプログラムはうまくいきましたよね?
ゲームを製作される時は、13章のプログラムをお使いください。
モニタのリフレッシュはだいたい60が一般的じゃないかと思いますが、モニタが対応していれば簡単に変更可能です。
もしVistaなら
デスクトップ右クリック>画面の設定>詳細設定>モニタ
で変更可能です。XPでも同じような手順で出来ます。
もしゲームのFPSを一定にたもつ処理をしなければ、
このリフレッシュを早くすればゲームの進行も早くなってしまうので気をつけてください。(時間を計って移動制御しているようなプログラムではおきませんが、ループ回数のカウンタを使っているような場合速さが変化します)
Re:ゲームプログラミングの館の12節について
しかし、12節の文で画像動いてるように見えたりチラついたりするように書かれていますが
それすらなりません。
似たようなことで、
違う話になってすみませんが、Cをつかって1文字表示して間をおいてまた1文字表示する・・・というプログラムを作りたくて下のように書いたのですが、
実行すると5秒ほどたって一気に「aaaaa」と表示するようになってしまいます。
これらはなぜおこるのでしょうか?
それすらなりません。
似たようなことで、
違う話になってすみませんが、Cをつかって1文字表示して間をおいてまた1文字表示する・・・というプログラムを作りたくて下のように書いたのですが、
実行すると5秒ほどたって一気に「aaaaa」と表示するようになってしまいます。
これらはなぜおこるのでしょうか?
#include<stdio.h> #include<windows.h> int main(void) { int i; for(i=0;i<5;i++){ printf("a"); sleep(1); } return 0; }
Re:ゲームプログラミングの館の12節について
12章のプログラムは使うことが無いと思うので、正常に表示されなくていいのです。
また、しばらくしてからaaaaaが表示されるのは単にまだプロセスが実行されてないだけなのでは?
生成した実行ファイルを直に実行したらどうなりますか?
また、しばらくしてからaaaaaが表示されるのは単にまだプロセスが実行されてないだけなのでは?
生成した実行ファイルを直に実行したらどうなりますか?
Re:ゲームプログラミングの館の12節について
Vistaをお使いではないですか
Vistaでは12章のプログラムは解説通りには動かなかったと思います
(表画面に直接描画できない)
Vistaでは12章のプログラムは解説通りには動かなかったと思います
(表画面に直接描画できない)
Re:ゲームプログラミングの館の12節について
>toyoさん
なるほど。
Vista使ってますのでそのせいなんですね
上に書いたコードを、sleepとwindowsの最初を大文字にしてc++としてvisual studioでコンパイルするとちゃんと思うように動きました。
しかし、学校でLinuxを使ってCのプログラミングをしていて、Cで作りたいのです。
家のPCでcygwinをインストールして、gccでコンパイルして実行すると、後から一気に表示するようになってしまいます。
gccのせいなのですか?
というか、これを最初に書くべきでしたね、本当にすみませんm(_ _)m
cygwinでgccでコンパイルしたものをwindowsで実行しようとすると「cygwin1.dllが見つかりません~」などとでて実行できません。
なるほど。
Vista使ってますのでそのせいなんですね
上に書いたコードを、sleepとwindowsの最初を大文字にしてc++としてvisual studioでコンパイルするとちゃんと思うように動きました。
しかし、学校でLinuxを使ってCのプログラミングをしていて、Cで作りたいのです。
家のPCでcygwinをインストールして、gccでコンパイルして実行すると、後から一気に表示するようになってしまいます。
gccのせいなのですか?
というか、これを最初に書くべきでしたね、本当にすみませんm(_ _)m
cygwinでgccでコンパイルしたものをwindowsで実行しようとすると「cygwin1.dllが見つかりません~」などとでて実行できません。
Re:ゲームプログラミングの館の12節について
混乱していた所、全く同じ質問をされている方がいらっしゃったので助かりました。
当方もOSはVistaでした。
症状は同じで、描画のループ処理が終わった後に一気に表示されるというものでした。
12節に注意書き等が有った方が良いかもしれません。
13節は正常に動作しました。
当方もOSはVistaでした。
症状は同じで、描画のループ処理が終わった後に一気に表示されるというものでした。
12節に注意書き等が有った方が良いかもしれません。
13節は正常に動作しました。