■ 新・ゲーム開発講座




■ へっぽこプログラミング入門♪


■第18夜:改ページ@

今回は改ページ処理についてです。今までは1ページ分しかテキストを表示できませんでしたのでノベルというよりは「本日の独り言」程度の内容しか表現できませんでしたが、改ページ処理が出来るようになれば長い文章でも大丈夫♪(^0^) … ということで、さっそくですが仕様です。


■書式:#page

表示してあるテキストを消去して、背景画像で画面を書き換える



さて「背景画像で画面を書き換える」という作業になる訳ですが、今までのプログラムでは1枚のバックサーフェイス上に直接、画像と文字を書き込んでいく方式だったのでそのままでは無理があります。
別途背景画像を保持しておくサーフェイスを用意して、ここから転送してやることにしましょう。




■背景画像サーフェイスの生成

例によって、main.cpp にてサーフェイス管理用のグローバル変数を追加します。


HDC
HBITMAP
BG_DC; //デバイスコンテキスト(背景画像)
hBG_Bitmap; //背景画面本体のハンドル
サーフェイスの初期化は、第13夜のバックサーフェイス生成とまったく同じです。初期化の最後にデフォルトの背景を読み込むようにしておきましょう。(main.cpp参照)

//-----------------------------------
// 背景画像用サーフェイス初期化
//-----------------------------------

void init_BG_Surface()
{

HDC work_hdc; //作業用のDC

//■ バック画面の初期化
work_hdc=GetDC(hwnd); //主(表)画面のDCの内容を取得
BG_DC=CreateCompatibleDC(work_hdc); //同じ設定でバック画面用のDCを生成
hBG_Bitmap=CreateCompatibleBitmap(work_hdc,640,480); //主(表)画面と同じ属性で画面生成
SelectObject(BG_DC,hBG_Bitmap); //DCと画面本体を関連付ける

Load_Bmp( BG_DC,"Back00.bmp"); //デフォルト背景BMPを読み込んでおく

ReleaseDC(hwnd,work_hdc); //作業用DCを開放


}


//----------------------------------
// 初期化メイン
//----------------------------------

void init_game()
{

init_Back_Surface(); //Back Surface作成
init_Parts_Surface(); //Parts Surface作成
init_BG_Surface(); //BG Surface作成

//背景となるグラフィックデータをバックサーフェイスに転送しておく
BitBlt(Back_DC,0,0,640,480,BG_DC,0,0,SRCCOPY);

Init_Text_engine(); //テキストエンジン初期化

init_Mode_stat(); //Mode_statにまとめたフラグ類の初期化


}



■フラグ

今回は単なるサーフェイス間転送で BitBlt() 一発で完了してしまうので、必要ありません。

■コマンド解釈部

以下のようにコマンド初期化関数 Com_page() を追加します。(TextEngine.cpp)


void Command_call()
{
//省略

//コマンド名の評価 → 処理関数呼び出し
if( strcmp(com_name,"delay" )==0 ){ Com_delay(); flag=ON;} //遅延
if( strcmp(com_name,"wait" )==0 ){ Com_cursor_blink(); flag=ON;} //カーソルブリンク
if( strcmp(com_name,"w" )==0 ){ Com_cursor_blink(); flag=ON;} //カーソルブリンク
if( strcmp(com_name,"halt" )==0 ){ Com_halt(); flag=ON;} //終了
if( strcmp(com_name,"page" )==0 ){ Com_page(); flag=ON;} //改ページ

//省略
}

■コマンド本体

コマンド本体はとてもシンプルです。背景画像をバックサーフェイスに転送することで、いままで表示していた文字を消してしいます。その後、文字表示位置をテキストエリアの左肩にリセットすれば完了です。

int Com_page()
{

//背景データでバックサーフェイスを書き換える
BitBlt ( Back_DC,0,0,640,480,BG_DC,0,0,SRCCOPY ) ;

//文字表示位置をテキストエリアの左肩にリセットする
TEXT_X = TEXT_AREA.left ;
TEXT_Y = TEXT_AREA.top ;

return 0;


}

さっそく、サンプルソースを実行してみましょう。ちゃんと改ページ処理が出来ていますね♪