現在、ゲームの進行状況をセーブする際にセーブ時のスクリーンショットを取り、これを縮小しセーブデータに含める
方法を探しているのですが、良い方法が見つからないため質問致します。
(ノベルゲームによくある、ロード画面にセーブ時のスクリーンショット一覧が並ぶようなものを実装します)
方針として、GetDrawScreenGraphで画面の情報を取り込み、これをどうにかして縮小し、セーブデータ用の構造体に格納しバイナリデータとして出力したいと考えています。
縮小に使えそうな関数として、DrawExtendGraphやGraphFilterがありますが、DrawExtendGraphは即画面に出力してしまうので、これは保存するには向きません。
またGraphFilterの縮小フィルタでは1/2, 1/4, 1/8のサイズしか指定することができません。
また、仮に上手く希望のサイズに縮小が出来たとしても、それを下記コードの構造体に格納することができません。
(グラフィックハンドルは単なるint型の数値で画像としての意味をもたないため)
また、上手く構造体に格納できたとしても、これを画像として復元する方法がありません。
//セーブデータ管理用構造体
typedef struct SaveData_tag{
int id;
int scenario; //シナリオの進行状況など
unsigned char *image; //(仮)構造体にイメージデータを格納したい
} SaveData;
SaveData data;
FILE *fp = fopen("save.dat", "wb");
fwrite(&data, sizeof(data), 1, fp);
fclose(fp);
しかしこの方法では、シナリオ進行状況等のデータと画像データが別ファイルになってしまいます。
また、これに目をつぶったとしても、ロード画面を呼び出した際に(セーブデータが複数あれば)複数の画像の縮小表示処理をしなければならないため、
画面表示の際の負荷が非常に高くなってしまいます。
これらの問題を解決して、
1. (可能ならば)シナリオ進行状況などのデータと縮小したスクリーンショットを1つのファイルにまとめる
2. (1が困難であれば)シナリオ進行状況とスクリーンショットは別々のファイルでいいので、スクリーンショットを縮小して保存する
このどちらかの方法を実装したいと思います。
どういった方法にて実装すれば良いのでしょうか。