今回の講座の発端をおさらいをしましょう。
第2回『絵を動かそう』で『消えている』→『表示』→『消えている』→『表示』を繰り返すと
画面の表示がちかちかしてしまい、とても見苦しいのでなんとか常に『表示』の状態を保てないか、
という所から今回の『ダブルバッファリング』の話題になったわけです。
常に『表示』の状態を保つための『ダブルバッファリング』と言う手法の仕組みをここで説明したいと
思います。
まず現在の手法を見なおしてみると
1.画面をまず初期化(真っ黒に)する
↓
2.画面に必要なキャラクターや背景グラフィックを描く
↓
3.1フレーム分の画面の完成
↓
1.『画面の初期化』に戻る
という手順を繰り返しています。
プレイヤーに見てもらいたいのは3の完成した画面だけなのですが、現在の手法では上記の手順の間
ずっとプレイヤーはその過程を見る事になり結果見苦しくなってしまっています。
ここで確認すべき重要点はプレイヤーに見せるべきは完成された画面だけ、という事です。
つまり画面を初期化したり必要なグラフィックを画面に描画しているときをプレイヤーに見られなければ
良いのです。ですが今のままでは画面の初期化をした時点でプレイヤーにそれを確認されてしまいます。
さあ困りました。
困りましたが、答えは当然出ています。それは
『ならばプレイヤーには見えない画面を作ってしまえ。』
です。
つまり普段プレイヤーが見えないもう一つの画面を用意して、その画面に必要な描画を行い、画面が完成してから
プレイヤーが見えている画面にそれを丸ごとコピーしてしまおうというのです。
この方法を実現するための苦労は私達には必要はありません。何故ならDXライブラリにこの機能が備わっているからです。
尚、もう既にお気付きかと思いますがこの手法こそダブルバッファリングという技術であります。
ともあれDXライブラリにダブルバッファリングの機能が備わっているわけですから、早速使ってみましょう。
というわけでダブルバッファリング機能を使うように手を加えたゲーム制作講座2のサンプルプログラムは
次の通りです。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int i ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1 ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 一番左上に絵を表示、20分の1秒待つ、を13回繰り返す
for( i = 0 ; i < 13 ; i ++ )
{
// 画面に描かれているものを一回全部消す
ClearDrawScreen() ;
// 絵を表示
LoadGraphScreen( i * 10 , 100 , "test1.bmp" , FALSE ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
// 20分の1秒待つ
WaitTimer( 50 ) ;
}
// キーの入力待ち
WaitKey() ;
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
<実行例>

実行例の画面グラフィックは何も変わりませんが、実行してみればちらちらしなくなったことを確認できると
思います。
さて今回の主役であるダブルバッファリングを扱うための関数は2つあります。一つは SetDrawScreen 関数
もう一つは ScreenFlip 関数です。
SetDrawScreen 関数は描画先の画面を指定するための関数です。画面の種類は表画面と裏画面の2種類があり、
それぞれ #define 定義された DX_SCREEN_FRONT と DX_SCREEN_BACK で指定します。上記のサンプルでは
DX_SCREEN_BACK 、つまりこれから裏画面に描画する事を指定しています。
表画面は先程の『プレイヤーに普段見えている画面』のことを示し、裏画面は『プレイヤーには見えない画面』
のことを示します。基本的にこの2つの画面はプレイヤーに見えているかいないかの違いを除いて扱う上で違いは
何一つありませんので使わない手はありません。
そして裏画面への描画が無事終った暁には ScreenFlip 関数の出番です。
これは裏画面に描かれているグラフィックを丸ごと表画面にコピーする関数で、この関数を使えば晴れて完成
された絵がプレイヤーの目に入ります。
早いですがこれで今回の目的は達成できました。
ちかちかしないで絵を動かす事も出来るようになりましたので、次はキーボードやゲームパッドを使って絵を動かしてみましょう。
戻る