DxLibを使ってDQ風な形式のRPGを作っているのですが、
適当に基礎を学んだ後、試行錯誤を繰り返しながら
使えなくはない方法をごり押しで使ってきてかなり作りこんでしまい、
試行錯誤の名残など色々と汚い部分が多いため、一度作り直そうと考えています。
このタイミングで、曖昧なままだった基礎的な部分の大量の疑問を解決して
おきたいので、色々と質問させてください。
長いですが基本的なことが並んでいますので、どうかご指導よろしくお願いします。
ファイルにデータをセーブしたり、ファイルからロードする方法についてです。
数値や文字列などが混在した情報を保存しようとしています。
エクセルのような表形式にまとまっているデータを読み出すような
使い方をします。
1、一般に、データを保存するファイルの形式はどの形式を使われているのでしょうか。
現在はtxt形式のままやっていますが、できるだけデータを見たり書き換えたり
できないようにというのもそろそろ考慮に入れたいと考えています。
2、読み出し、書き出しのアルゴリズムの基本形みたいなものが知りたいです。
基礎を適当に学んだ後、使えなくはないのでそのままごり押しで使ってますが
よりスマートな一般的な書き方などあればそちらを使いたく思っています。
現在は以下のような、1文字分ずつずらしていって、\tがきたらデータの切れ目なので
そこまでの文字列を読んでintに変換したりしてます。
データ自体は、id,名前,para[0],para[1],…,para[40] みたいな感じで並んでます。
para(パラメーター)はHPやすばやさといったステータス値です。
また、HPやspeedといったわかりやすい変数名にしたかったのですが、
if(i==3)data[j].hp = atoi(&buff[kaisi]);
if(i==4)data[j].mp = atoi(&buff[kaisi]);
といった行が何十行も続いてしまっています。何か良い書き方があれば
アドバイスお願いします。
///////ロード///////
char buff[256];
FileHandle = FileRead_open( "data\\charadata.txt" ) ;
for (j=0;j<KYARASU;j++) //1行に1人分のデータなので人数分の行繰り返し
{
FileRead_gets( buff, 256, FileHandle );
kaisi = 0;
i=0;
for (k=0;k<256;k++)
{
if (buff[k] == NULL) break;
if (buff[k] == '\t')
{
buff[k] = '\0';
if (i==0){
data[j].id = atoi(&buff[kaisi]);
}else if (i==1){
sprintf(data[j].name , "%s" ,&buff[kaisi]);
//data[j].name = &buff[kaisi];
}else{
data[j].para[i-2] = atoi(&buff[kaisi]);
}
kaisi = k+1;
i++;
}
}
}
FileRead_close( FileHandle ) ;
//////セーブ///////
fp = fopen( filename, "w" );
for (j=0;j<KYARASU;j++){
sprintf (saveyou,"%d\t%s\t" , data[j].id , data[j].name);
fprintf (fp,saveyou);
for (i=0;i<40;i++){
sprintf (saveyou,"%d\t" , data[j].para[i]);
fprintf (fp,saveyou);
}
fprintf (fp,"\n");
}
fclose (fp);
3、文字列は、どの型で扱うのが良いのでしょうか。
最初にcharの配列を使う方法を学んでそれで事足りてるので、そのまま
現在はcharの配列を使っていますが、字数が少ないものは無駄ができたりするので、
DxLibの仕様との兼ね合いも考えて、String型あるいはその他の方が
良いといったことがもしあれば教えてください(String型はまだ何もわかってないです)。
4、たとえば敵のデータなど(画像ではなく数値や文字のデータのみ)を、
ファイルからLoadするタイミングはいつが良いか困っています。
起動時に読み出しておく場合はメモリ占有量が気になり、
必要に応じてファイルにアクセスして読む場合は速度が気になっています。そこで、
メモリ使用量が、どの程度だと多すぎてやばいのかという目安が
検討がつきません。256×256の2次元マップのデータには、65536×4バイト(int型)
になるわけですが、これぐらいだと全然大丈夫ですが、その他に音楽や
画像もLoadすることになることを考えると、増えすぎると困るなら
節約可能なところ限り節約する仕様にしたいと思っているため、
どの程度なら余裕、どの程度なら危険、といった目安を教えてください。
物理メモリは256MBでもサクサク動く程度にしたいと思っています。
5、1)背景を描いて、2)ウィンドウを描いて、3)文字列を5つほど描いて、
4)文字列の中のどれを選ぶかのカーソルを描き
5)キー入力に応じてカーソルを動かす、というよくある動作をやるとき、
キーレスポンスが気になったので、
3)の文字列まで描いたものをいったんGetDrawScreenGraphして、
キー入力待ちループでは、そのGraphを描いて、カーソル描いて
という風にしているのですが、PCによってはむしろGetDrawScreeGraphで
時間がかかってるようなので速度重視には逆効果に思えているのですが、
このような方法はあまり良くないのでしょうか?
キー入力待ちループで毎回、背景とウィンドウと文字とカーソルを
描く方が良いのでしょうか?