■ 新・ゲーム開発講座




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


■第21夜:BMPの読み込み

前回までで、テキスト表示部分に関してはへっぽこ的に実用上遜色の無い?レベル (贅沢を言えばキリが無いですけどねぇ… ^^) のことは出来るようになりました。ここから先はゲームとしての味付けを進めていく要素が濃くなります。どんどん行きましょう♪

・・・で、今回はBMPの読み込みです。第6夜ではプログラム上から直接指定で表示する例を示しましたが、今回はスクリプト上からファイル名を指定して読み込めるようにします(まずは読むだけ ^^)。そう、結局スクリプトから何がどれだけできるか、というところが重要です。低レベルであろうが何だろうが、手を抜かずに(…でもヌルい方法で:爆死)行きましょう。

■書式:#g_load vram,file_name

指定サーフェイスに指定ファイル名のBMPを読み込む。

vram :バックサーフェイス=BS 背景画面=BG パーツ画面=PT
File_name:拡張子まで含めたファイル名


■フラグ

BMPの読み込みは一発完了型の処理なので Mainloop() のフラグは関係ありません。

■コマンド解釈部

もうほとんど定型化してきましたが(^^)、以下のように処理関数を登録しておきます(TextEngine.cpp)。コマンド処理関数は Com_g_load() とでもしておきましょう。



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;} //改ページ
if( strcmp(com_name,"g_load" )==0 ){ Com_g_load(); flag=ON;} //BMPのLOAD

// 省略


}

■処理関数

読み込み自体は第6夜ですでに一度解説していますので、今回はパラメータの解析くらいしか説明するところがないような気が・・・(^^)でも、いちおう 「へっぽこプログラミング入門」 としてはなにか解説をしない訳には行きませんから、無理してでも解説♪(爆死)

とゆーことで、コマンド本体 Com_g_load() の処理内容について解説します。この関数が呼ばれた段階で、テキストポインタ *TEXT はスクリプトファイル default.txt 上でコマンド名 #g_load の最後の部分を指した状態になっています(コマンド名解釈が終ったところですから)。そこでとりあえず TEXT++ して1バイト分ポインタを進め、コマンド名に続くパラメータを拾う準備をします。

【1つ目のパラメータ】
パラメータを拾う関数は TextEngine.cpp 内に幾つか追加してありますが、今回は文字列を切り出す Kaiseki_TextStr() を呼んでいます(簡単な内容なのでこの関数の中身の解説は割愛します:^^)。これを用いてまず画面指定文字列を配列 vram に格納します。文字列解析後はポインタ *TEXT は画面指定文字列の最後をポイントしていますので、次のパラメータの先頭までポインタを進めてやります。常識的にパラメータとパラメータの間にはスペース、カンマ[,]、タブ[0x0a]しか存在しない筈なので、これらが続く限りポインタをインクリメントする訳ですね。

【2つ目のパラメータ】
2つ目のパラメータはファイル名です。リストを見れば分かると思いますが、実は今回からグラフィックデータはフォルダ gdat の下に置くように変更しているので、配列 f_name にまずパス名(main.hで #define しています)をコピーし、その後解析したファイル名を継ぎ足す格好になっています。(フォルダ分けしないと本格ゲームを作るときに死にます・・・きっと ^^;)

【画像読み込み】
で、パラメータが拾えたところで、g_tool.cpp 内にあるBMP読み込み関数 Load_Bmp() を呼んでいる訳です。Load_Bmp() は第6夜で取り上げたBMP読み込みプロセスをラッピングしたものです(内容は、そっくり同じ ^^;)。なお、画像の読み込み先としてDCのハンドルを渡してやらないといけないのですが、スクリプト上からパラメータ指定で読み込み画面を選択できる仕様ですので、ちょっと工夫が必要です。そこで画面判別をするために Get_game_DC() なる関数(下記参照)をこしらえました。単純に文字列比較をしてハンドルを返しているだけですが、この部分を変更すれば テキストスクリプト上で使用できるシンボル名を好きな名前に変更できます。BS、BG、PT の表記では分かりにくいよ〜、という方は適宜この部分を変更してご使用下さい。(今後作成するコマンドも、画面指定にはこの関数を呼び出す仕様で作っていきたいと思います♪)


HDC Get_game_DC( char *str )
//サーフェイスに与えられたシンボル文字列に応じてDCのハンドルを返す。
//まあスクリプト上からどんな名前でサーフェイスを指定するかってことですね♪
{

char buf[256];

//↓スクリプトで扱うサーフェイス名を変更したい場合はここを変更してね

if( strcmp( "BS" , str )==0 ) return Back_DC; //バックサーフェイス
if( strcmp( "BG" , str )==0 ) return BG_DC; //背景画面
if( strcmp( "PT" , str )==0 ) return Parts_DC; //パーツ画面

sprintf( buf, "シンボル [%s] は意味不明ですぅ(爆)\n暴走したら恐いので強制終了ですぅ〜♪",str );
msg( buf,"Get_game_DC()");
PostQuitMessage(0);

return Back_DC; //コンパイルエラーを抑えるための無意味な return(爆)


}

int Com_g_load()
//BMPを読み込む
{

char vram[32];
char f_name[256];

//画面指定の解釈
TEXT++;
strcpy( vram, Kaiseki_TextStr() ); //画面指定切り出し
while( *TEXT==',' || *TEXT==' ' || *TEXT==0x0a )TEXT++; //[,][ ][TAB]を飛ばす

//ファイル名の解釈
strcpy( f_name, G_PATH ); //Path
strcat( f_name, Kaiseki_TextStr() );

Load_Bmp( Get_game_DC(vram), f_name ); //読むだけなので1行で終ってしまう(笑)

return 0;


}

そんなこんなで、次回に続きます。…あ、ソース&サンプルスクリプトはこちらです。それにしても、↓絵が出ると俄然、雰囲気が変わってきますね♪(^^)