6章で裏画面処理の必要性について説明しました。裏画面に画像を描画して、1フレーム分の画が出来たら表画面に反映する手順を踏みます。
と言っても、またもさすがのDXライブラリ。全く難しいことはありません。
・描画先を裏画面にする関数を最初に呼んでおく
・ループの最後に裏画面を表画面に反映する関数を呼ぶ
これだけで実現出来てしまいます。
描画先を裏画面にするには
SetDrawScreen( DX_SCREEN_BACK );
と最初に一度だけ書いておきます。
すると DrawGraph関数 など、描画する関数で画像を描画すると自動的に裏画面に描画されます。
後はループの最後に裏画面に描いた内容を表画面に反映する関数である ScreenFlip関数 を呼び出せばいいだけです。
今回も、ただこの関数を呼び出せばいいだけで詳しく知る必要はないので、関数の詳細は説明しません。
では今回追加した差分を確認して下さい。
差分表示
#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode( TRUE ); // ウィンドウモードに設定 DxLib_Init(); // DXライブラリ初期化処理 SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定 int x = 0; int Handle; // 画像格納用ハンドル Handle = LoadGraph( "画像/キャラクタ01.png" ); // 画像のロード while( 1 ){ if( ProcessMessage() != 0 ){ // メッセージ処理 break;//ウィンドウの×ボタンが押されたらループを抜ける } ClearDrawScreen(); // 画面を消す DrawGraph( x, 100, Handle, TRUE ); //画像の描画 x = x + 2; // xを2増やす ScreenFlip(); //裏画面を表画面に反映 } DxLib_End(); // DXライブラリ終了処理 return 0; }
実行結果
※ 黄色い矢印や文字は後から付け足したものです。実際には表示されません。
どうでしょう。さっきよりずいぶん滑らかに動いていると思います。(Youtubeで見ると滑らかに見えない場合があります)
ゲームを作る時は必ず裏画面処理をしましょう。
少し今までのことをまとめると・・。
while文を一周すると1フレームを表します。
while( 1 ){
メッセージ処理をする;
画面に描画した内容を消す;
画像を描画する;
裏画面に描いた内容を表画面に反映する;
}
このような順番で処理をしていました。
鋭い人はお気づきかもしれませんが、今回while文の中のSleep文が無くなっていますね。
処理を一定時間止める処理を書かなければ、CPUは1秒で数億以上の計算をしてしまいますから、
ものすごい速さでwhile文を回ってしまうのでは?と思う人もいるかもしれません。
しかし、今回、ScreenFlip関数 という、裏画面に描いた内容を表画面に反映する関数を呼んでいます。
前の章では、モニタがリフレッシュ(書き換わる)するタイミング以外で画面を更新するからチラついたりガクガクしたりしました。
この関数を使うと自動的にモニタがリフレッシュするタイミングまで待って、リフレッシュのタイミングで表画面に表示してくれます。
すなわち、60Hzで動作しているモニタを使っている場合は、1/60秒ここで待機しているのです。
よって、ループ内で、2ずつカウントアップしていたxは1秒間に60回加算されるわけですから、1秒間に120増えることになります。
画面の解像度が横640ピクセルですから、1秒間に120ピクセル移動すると、端から端までは 640÷120 = 5.33..秒で移動することがわかります。
このように一般的にフレーム依存のゲームは1秒間に何フレーム処理するかを表す「フレームレート」から移動速度を求めることが出来ます。
「ゲームのFPS」という言葉を聞いたことがある人もいるでしょう。これは「Frame Per Seconds」の略で、1秒間に何フレーム描画するかを表します。
数が多いほど滑らかに動きますが、一般的にPCのモニタは60Hzです。(中には60以上の物もあります)
ですから、普通ゲームは60FPSを前提に作ることが多いです。
長くなりましたから本章はこれ位にしておきましょう。
- Remical Soft -