今回はキャラクタの位置情報をファイルから読み込みます。別段難しい処理は行いません。
キャラクタ管理クラスCCharaManageの初期化関数Init()で処理します。まず引数にあるファイルを開いて、中に入っているデータを一行ずつ読み込んでいきます。データ形式は以下のような感じです。
0,3,5,-1
これは、キャラクタ種類、X座標、Y座標、親IDという順番です。座標はピクセルで入力すると面倒なので、1キャラクタ単位である48ピクセル毎に配置します。つまり上のデータ形式ではX=3、Y=5になってますが、実際はX=144、Y=240に配置されます。あと親IDが-1なのは親がいないという意味です。
読み込んだ行が空の場合、もしくは#が入ってる場合はコメント行と判断して、処理は行いません。これでデータファイル内にコメントが書き込めますね。
strtok_s()でカンマ区切りの数値を取り出し、CreateChara()でキャラクタを生成します。
これでゲームステージ内の任意の場所に、キャラクタを配置できるようになりました。次回は画面スクロールかな。
//-----------------------------------------------------------------------------
// 初期化
void CCharaManage::Init(char *filename)
{
int ikind, ix, iy, iparent;
char str[256], *nexttoken;
FILE *fp;
// キャラクタ情報読み込み
if((fopen_s(&fp, filename, "r"))!=0) {
sprintf_s(str, 256, "%s が見つかりません", filename);
MessageBox(NULL, str, "CharaManage::Init", MB_OK);
return;
}
while (fscanf_s(fp, "%s", &str, 256)!=EOF) {
if (sizeof(str)!=0 && strstr(str, "#")==NULL) {
// 分解する
ikind=atoi(strtok_s(str, ",", &nexttoken));
ix=atoi(strtok_s(NULL, ",", &nexttoken));
iy=atoi(strtok_s(NULL, ",", &nexttoken));
iparent=atoi(strtok_s(NULL, ",", &nexttoken));
if (iparent==-1) {
// 親がいない場合
CreateChara(ikind, (ix*48), (iy*48), NULL);
}
else {
// 親がいる場合
CreateChara(ikind, (ix*48), (iy*48), Chara[iparent-1]);
}
}
}
fclose(fp);
}