ゲーム開発17:キャラクタ情報をファイルから読み込む

今回はキャラクタの位置情報をファイルから読み込みます。別段難しい処理は行いません。

キャラクタ管理クラス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);
}

コメントを残す

メールアドレスが公開されることはありません。