今回はキャラクタの位置情報をファイルから読み込みます。別段難しい処理は行いません。
キャラクタ管理クラス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); }