はじめまして。
現在こちらのシューティングゲームの館を参考にしながら、シューティングゲームを作成しようとしているプログラミング初心者です。
館に載っていた分は目を通したのですが、ひとつ知りたかったことで載っていないため、わからないことがあり質問をお願いさせていただきます。
質問の内容は、敵の発生に関してなのですが、敵の発生を外部のテキストファイルに1行目から順に1行ずつ、
[敵が発生するカウント値],[発生する敵の画像種類のフラグ値],[発生する敵の移動速度のX方向設定値],[発生する敵の移動速度のY方向設定値],[発生する敵の攻撃パターン],[発生する敵の初期X座標],[発生する敵の初期Y座標],[倒された時に出すアイテムの種類フラグ],\n
と記述しておき、
本体のプログラムの方ではcounterの値が1増える間に、counter==[敵が発生するカウント値] の行のデータだけを外部テキストファイルから読み取って、","で区切られた文字列ごとに、事前に本体プログラムの中に定義しておいた敵構造体、
typedef struct enemy_kouzou{
int enemy_starttime;
int enemy_type_flag;
double enemy_speed_x;
double enemy_speed_y;
int enemy_atacck_type;
double enemy_syoki_x;
double enemy_syoki_y;
int item_type;
int flag;
}enemy_k
の中に、counter==[敵が発生するカウント値] の敵データをそれぞれ読み込ませて発生させる、というプログラムを作成したいのですが……
こういったモノを作りたい場合、
1外部テキストファイル内の行数を1000までに制限しておくとして、
手順①
enemy_k enemy[1000];
int enemy_No = 0;
でenemy_k構造体を1000個用意する&初期値0の変数enemy_Noを作成。
手順②
初期化時に、fopen関数で敵データの入った対象の外部テキストファイルの読み込み→while(1)でループ開始→fgets関数で外部テキストファイルから1行読み込む→読み込んだ行のデータを","ごとに区切って構造体enemy[enemy_No]に代入→if文で読み込んだ行の末端が\0ならbreak;を行ってwhileから脱出。\nならenemy_No++ で次のenemy構造体への準備→whileで戻る。
としておき、
あとはゲーム進行中に、敵の発生ルーチン部でwhile文とif文とを組み合わせて、条件が
count==enemy[enemy_No].enemy_starttime
となった場合には、そのenemy_Noの敵が発生する。
というようにプログラムを行えばいいのでしょうか?
長文で質問内容が判りづらくなってしまっていたらすみません。
ようはシューティングゲームとしての基本機能は本体プログラムに定義しておき、敵が発生するタイミングや発生する敵がどのタイプなのかについての情報は別ファイルに用意しておいて、
その別ファイルの部分で発生する敵のタイミングやタイプについての値を変えたり、その別ファイルを複数用意して入れ替えるだけで
敵の出現パターンや内容を簡単に変化させられるようにしたいのです。
よろしくおねがいします。
あ、あとできましたら、「読み込んだ行のデータを","ごとに区切って構造体へと代入」する方法についても、どなたかサンプルプログラムなどを見せていただけないでしょうか……
スクリプタを作りたいのですが……
Re:スクリプタを作りたいのですが……
こんな感じでしょうか?
#include <stdio.h> typedef struct enemy_kouzou { int enemy_starttime; int enemy_type_flag; double enemy_speed_x; double enemy_speed_y; int enemy_atacck_type; double enemy_syoki_x; double enemy_syoki_y; int item_type; int flag; } enemy_k; // 構造体の読み込み処理 // 戻り値 0 = NG : 1 = OK int load_struct(FILE* fp, enemy_k* buf) { int check; check = fscanf(fp, "%d, %d, %lf, %lf, %d, %lf, %lf, %d, %d\n", &buf->enemy_starttime, &buf->enemy_type_flag, &buf->enemy_speed_x, &buf->enemy_speed_y, &buf->enemy_atacck_type, &buf->enemy_syoki_x, &buf->enemy_syoki_y, &buf->item_type, &buf->flag); if (check != 9 || check == EOF) { return 0; } return 1; } void main(void) { int i; FILE* fp = NULL; enemy_k ek[1000]; if ((fp = fopen("EnemyData.txt", "rt")) == NULL) { printf("File Open Error!!\n"); return; } for (i = 0; i < 1000; i++) { if (load_struct(fp, &ek) == 1) { printf("Index[%04d]\n", i); printf("enemy_starttime = %d\n", ek.enemy_starttime); printf("enemy_type_flag = %d\n", ek.enemy_type_flag); printf("enemy_speed_x = %f\n", ek.enemy_speed_x); printf("enemy_speed_y = %f\n", ek.enemy_speed_y); printf("enemy_atacck_type = %d\n", ek.enemy_atacck_type); printf("enemy_syoki_x = %f\n", ek.enemy_syoki_x); printf("enemy_syoki_y = %f\n", ek.enemy_syoki_y); printf("item_type = %d\n", ek.item_type); printf("flag = %d\n", ek.flag); printf("\n"); } else { break; } } fclose(fp); }