■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第50夜:システムメニュー:SAVE さてずいぶん時間がかかりましたが、ようやく長い旅路の果てにシステムメニューに戻って参りました(汗 ^^;) SAVEの基本要素は既に前回まででほぼ揃っていますので、ここではインターフェイス周りの整備を行ってシステムメニューの体裁を整えましょう。待望?のソースはこちらです。 まずは動作画面ですが、以下のようなものを作ります。SAVEスロットはとりあえず8ヶ所用意しました。増やす気になれば画面の許す限り増やせますが、まあこのくらいが妥当かな…と思いますのでフィーリングで決めています(^0^)。窓の中には前回までにSAVEした日付と時間を表示し、SAVEしていないスロットには日付/時間の表示はしません。ん〜それにしても、自力窓だとデザインも自由に出来てそれなりにオリジナルの雰囲気を出せるのでいいですねぇ(^0^) |
|
■ファイル情報を得るには 上記サンプル画像のような表示をするためには、当然ファイル情報を取得しなければいけません。本ソース上では、ファイル情報の取得は次のような関数で行っています(SystemMenu_01.cpp)。引数としてSAVEファイルの番号(int num)を渡し、それに応じたファイル名 (char *f_name) と選択ウィンドウに表示すべき文字列 (char *ptr) を取得するというものです。 |
bool get_file_info( char *f_name, char
*ptr , int num )
|
ここではSAVEファイル名は data**.svd という名前にして、フォルダ save の中に保存することにします。初期状態(ゲーム開始状態)では save フォルダの中身は空です。 さてまずファイルが存在するかどうかの確認ですが、Win32 API の FindFirstFile() でファイルを開けるかどうかで判定を行っています。ファイルが開けない場合、FindFirstFile() は INVALID_HANDLE_VALUE を返しますので、ウィンドウに表示する日付と時刻部分は "----.--.-- --:--:--" という文字列にしてしまいます。 なぜ CreateFile() でなくて FindFirstFile() で開くかといいますと、FindFirstFile() ではファイルオープンと同時に WIN32_FIND_DATA型の引数のアドレスにそのファイルの情報を書き込んでくれるので日付の取得が容易だからです。上記ソースでは WIN32_FIND_DATA型 の file_info という変数を宣言し、そのアドレスを FindFirstFile() に渡すことで情報を取得しています。file_info.ftLastWriteTime が前回ファイルを書き込んだ時間になります。 ただしこの時間は、世界標準時間で取得されるので日本時間とはズレています。 関数の戻り値は、ファイルが存在すれば true、存在しなければ
false とします。 下準備が整ったところで、いよいよメニュー窓を開きます。基本的な要領は41〜44夜と同じです。全部解説していると異様に長くなるので、不明な点は41夜〜を適宜参照願います。BMPは以下のようなものを用意することにしましょう。 |
|
ソースは以下のようになります。 これまでの窓表示とちょっと違うのは、選択支として表示するファイル情報を格納するために _Save_file_info という構造体を設け、SAVEスロットぶんだけ配列として用意しているところでしょうか。この構造体に、上記 get_file_info() で所得したファイル情報を格納しています。最後にフラグを立てて処理タスクを起動します。 |
#define _SAVE_MAX 8 //SAVE箇所の数(増やすときはBMP面積も拡張してね) _Menu_Win SysMenu_save; //SAVEメニューの窓情報用 //選択窓に表示する情報用
_Save_file_info Save_file_info[_SAVE_MAX]; _Save_stat Save_stat; //SAVEファイル構造体 //名前が長いと面倒なので短縮表記を定義(SAVE窓用) int System_save() //SAVEメニュー窓を開く
|
■Mainloop main.cpp の Mainloop() にフラグに応じてシステムメニューのSAVE窓タスクを呼び出す部分を追加します。 |
//================================================================== //メッセージ(マウスやキーの入力など)が無いときに実行するループ
|
■回す タスク部分も基本は41夜〜と一緒です。さすがに選択支が8個ともなるとループで処理したほうがいいのでちょっとだけスマート?にしてみました(爆) いずれかの選択アイテムがクリックされると変数 L_button_menu に選択されたアイテム番号が格納されます。有効な番号だったら、「SAVEしますか?」のメッセージボックスを出して、SAVE構造体をファイルに書き出します。ここでは念のために書き込み直後に再度 get_file_info()でファイル情報を取得して確認メッセージを表示しています(くどいと思ったら削除しちゃってください)。 |
int System_save_task() //システムメニューのタスク部分 {
|
■締める 処理の終了というよりは、窓を閉じてフラグを戻す部分だけ…というカンジになっている終了関数です。要領は今までと一緒なので、特に新味はありません。 |
void _System_save_task_end() //タスクの終了処理部分を分離したもの {
|
さて、では実行してみましょう。 次回は、いよいよLOADです。 |
|