csvによる敵の制御
Posted: 2012年5月09日(水) 22:23
ここの講座の通りにcsvで敵を制御しようとしているのですが、
csvで打ち込んだとおりに動いてくれません。
行動パターンが全て同じになったりします。
原因として何が考えられますか?
csvで打ち込んだとおりに動いてくれません。
行動パターンが全て同じになったりします。
原因として何が考えられますか?
void load_story(){
int n,num,i,fp;
char fname[32]={"scinfaxi.csv"};
int input[64];
char inputc[64];
fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
for(i=0;i<2;i++)//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');
n=0 , num=0;
while(1){
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(input[i]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0: enemy_order[n].c =atoi(inputc);break;
case 1: enemy_order[n].p =atoi(inputc);break;
case 2: enemy_order[n].k =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].bt =atoi(inputc);break;
case 6: enemy_order[n].bk =atoi(inputc);break;
case 7: enemy_order[n].hp =atoi(inputc);break;
case 8:enemy_order[n].bk2 =atoi(inputc);break;
case 9:enemy_order[n].wait =atoi(inputc);break;
}
num++;
if(num==10){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}
void enemy_enter(){
int i,t;
for(t=0;t<ENEMY_ORDER_MAX;t++){
if(enemy_order[t].c==stage_count){//現在の瞬間がオーダーの瞬間なら
if((i=enemy_num_search())!=-1){//敵の行動を登録・制御する関数
enemy[i].f =1;//フラグ
enemy[i].c =0;//カウンタ
enemy[i].p=enemy_order[i].p;//移動パターン
enemy[i].k =enemy_order[t].k;//敵の種類
enemy[i].x =enemy_order[t].x;//座標
enemy[i].y =enemy_order[t].y;
enemy[i].s=0;
enemy[i].bt =enemy_order[t].bt;//弾の発射時間
enemy[i].bk =enemy_order[t].bk;//弾幕の種類
enemy[i].bk2 =enemy_order[t].bk2;//弾の種類
enemy[i].wait =enemy_order[t].wait;//停滞時間
enemy[i].hp =enemy_order[t].hp;//体力
enemy[i].hp_max =enemy[i].hp;//体力最大値
enemy[i].a =0;//角度
}
}
}
}
void enemy_act(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy[i].f==1){//その敵のフラグがオンになってたら
if(0<=enemy[i].p && enemy[i].p<ENEMY_PATTERN_MAX){
enemy_pattern[enemy[i].p](i);
enemy[i].x+=cos(enemy[i].a)*enemy[i].s;
enemy[i].y+=sin(enemy[i].a)*enemy[i].s;
enemy[i].c++;
//敵が画面から外れたら消す
if(enemy[i].x<-60 || FIELD_MAX_X+60<enemy[i].x || enemy[i].y<-60 || FIELD_MAX_Y+60<enemy[i].y)
enemy[i].f=0;
if(enemy[i].bt==enemy[i].c)
enter_shot(i);
}
else
printfDx("enemy[i].patternの%d値が不正です。",enemy[i].p);
}
}
}
extern void enemy_pattern0(int i);
extern void enemy_pattern1(int i);
extern void enemy_pattern2(int i);
extern void enemy_pattern3(int i);
void (*enemy_pattern[ENEMY_PATTERN_MAX])(int) = {
enemy_pattern0,enemy_pattern1,enemy_pattern2,enemy_pattern3
};
double rang(double ang){
return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}
void enemy_pattern0(int i){
if(enemy[i].c<500){
enemy[i].s=2;
enemy[i].a=PI/2;
}
}
void enemy_pattern1(int i){
if(enemy[i].c<100){
enemy[i].s=2;
enemy[i].a=PI/2;
}
if(100<=enemy[i].c&&enemy[i].c<160){
enemy[i].a-=PI*(1.5/180);
}
if(160<=enemy[i].c&&enemy[i].c<220){
enemy[i].a+=PI*(1.5/180);
}
if(220<=enemy[i].c){
enemy[i].a=PI/2;
}
}
void enemy_pattern2(int i){
if(enemy[i].c<600){
enemy[i].s=2;
enemy[i].a=-PI;
}
}
void enemy_pattern3(int i){
if(enemy[i].c<10000){
enemy[i].s=1;
enemy[i].a=PI/2;
}
}