ここの講座の通りにcsvで敵を制御しようとしているのですが、
csvで打ち込んだとおりに動いてくれません。
行動パターンが全て同じになったりします。
原因として何が考えられますか?
csvによる敵の制御
Re: csvによる敵の制御
プログラムのバグが考えられます。
あなたが書いているソースコードを見せてくれないと、詳しいことはわかりません。
あなたが書いているソースコードを見せてくれないと、詳しいことはわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 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;//角度
}
}
}
}
Re: csvによる敵の制御
提示してもらったところは特に動作に問題ないように思えます。
敵の行動を制御しているところも見せてください。
(龍神録だとenemy.cppのenemy_act()関数の中身です)
敵の行動を制御しているところも見せてください。
(龍神録だとenemy.cppのenemy_act()関数の中身です)
Re: csvによる敵の制御
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);
}
}
}
Re: csvによる敵の制御
ここも問題ないようですね・・・
あと考えられる問題点として3つほどあげてみます。
1.enemy.cppの関数ポインタを使っている void (*enemy_pattern[ENEMY_PATTERN_MAX])(int)のところがおかしい。
2.enemy_pattern0とかenemy_pattern1関数の中身がおかしい。
3.csvファイルのpatternのデータが間違っている。
12章の内容と以上の三点を確認してみてください。
あと考えられる問題点として3つほどあげてみます。
1.enemy.cppの関数ポインタを使っている void (*enemy_pattern[ENEMY_PATTERN_MAX])(int)のところがおかしい。
2.enemy_pattern0とかenemy_pattern1関数の中身がおかしい。
3.csvファイルのpatternのデータが間違っている。
12章の内容と以上の三点を確認してみてください。
Re: csvによる敵の制御
>enemy.cppの関数ポインタを使っている void (*enemy_pattern[ENEMY_PATTERN_MAX])(int)のところがおかしい。
>enemy_pattern0とかenemy_pattern1関数の中身がおかしい。
>csvファイルのpatternのデータが間違っている。
ここにCSVファイルの全文を載せておきます
/カウンタ,移動パターン,敵の種類,x座標,y座標,発射時間,弾幕種類,体力,弾種類,待機時間
/cnt,pattern,knd,x座標,y座標,bltime,blknd,hp,blknd2,wait
100,0,0,100,-30,80,1,100,0,120
200,0,0,190,-30,80,1,100,0,120
300,0,0,540,-30,80,1,100,0,120
400,0,0,430,-30,80,1,100,0,120
500,0,0,160,-30,80,1,100,0,120
500,0,0,480,-30,80,1,100,0,120
700,0,0,150,-30,80,1,100,0,120
740,0,0,100,-30,80,1,100,0,120
740,0,0,200,-30,80,1,100,0,120
830,0,0,490,-30,80,1,100,0,120
870,0,0,540,-30,80,1,100,0,120
870,0,0,440,-30,80,1,100,0,120
960,0,0,320,-30,80,1,100,0,120
1020,0,0,380,-30,80,1,100,0,120
1020,0,0,260,-30,80,1,100,0,120
1080,0,0,200,-30,80,1,100,0,120
1080,0,0,440,-30,80,1,100,0,120
1200,2,0,670,100,80,1,100,0,120
1240,2,0,670,130,80,1,100,0,120
1280,2,0,670,160,80,1,100,0,120
1340,2,0,-30,120,80,1,100,0,120
1380,2,0,-30,150,80,1,100,0,120
1420,2,0,-30,180,80,1,100,0,120
1480,2,0,670,240,80,1,100,0,120
1540,2,0,670,290,80,1,100,0,120
1540,2,0,670,190,80,1,100,0,120
1600,3,0,-30,200,80,1,100,0,120
1660,3,0,-30,240,80,1,100,0,120
1660,3,0,-30,160,80,1,100,0,120
1780,3,0,-30,200,80,1,100,0,120
1800,3,0,320,-30,80,1,100,0,120
1920,3,0,160,-30,80,1,100,0,120
2010,3,0,480,-30,80,1,100,0,120
2130,3,0,200,-30,80,1,100,0,120
2130,3,0,400,-30,80,1,100,0,120
2160,3,0,50,-30,80,1,100,0,120
2240,3,0,600,-30,80,1,100,0,120
2360,3,0,520,-30,80,1,100,0,120
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;
}
}
ここにCSVファイルの全文を載せておきます
/カウンタ,移動パターン,敵の種類,x座標,y座標,発射時間,弾幕種類,体力,弾種類,待機時間
/cnt,pattern,knd,x座標,y座標,bltime,blknd,hp,blknd2,wait
100,0,0,100,-30,80,1,100,0,120
200,0,0,190,-30,80,1,100,0,120
300,0,0,540,-30,80,1,100,0,120
400,0,0,430,-30,80,1,100,0,120
500,0,0,160,-30,80,1,100,0,120
500,0,0,480,-30,80,1,100,0,120
700,0,0,150,-30,80,1,100,0,120
740,0,0,100,-30,80,1,100,0,120
740,0,0,200,-30,80,1,100,0,120
830,0,0,490,-30,80,1,100,0,120
870,0,0,540,-30,80,1,100,0,120
870,0,0,440,-30,80,1,100,0,120
960,0,0,320,-30,80,1,100,0,120
1020,0,0,380,-30,80,1,100,0,120
1020,0,0,260,-30,80,1,100,0,120
1080,0,0,200,-30,80,1,100,0,120
1080,0,0,440,-30,80,1,100,0,120
1200,2,0,670,100,80,1,100,0,120
1240,2,0,670,130,80,1,100,0,120
1280,2,0,670,160,80,1,100,0,120
1340,2,0,-30,120,80,1,100,0,120
1380,2,0,-30,150,80,1,100,0,120
1420,2,0,-30,180,80,1,100,0,120
1480,2,0,670,240,80,1,100,0,120
1540,2,0,670,290,80,1,100,0,120
1540,2,0,670,190,80,1,100,0,120
1600,3,0,-30,200,80,1,100,0,120
1660,3,0,-30,240,80,1,100,0,120
1660,3,0,-30,160,80,1,100,0,120
1780,3,0,-30,200,80,1,100,0,120
1800,3,0,320,-30,80,1,100,0,120
1920,3,0,160,-30,80,1,100,0,120
2010,3,0,480,-30,80,1,100,0,120
2130,3,0,200,-30,80,1,100,0,120
2130,3,0,400,-30,80,1,100,0,120
2160,3,0,50,-30,80,1,100,0,120
2240,3,0,600,-30,80,1,100,0,120
2360,3,0,520,-30,80,1,100,0,120
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: csvによる敵の制御
龍神録はソースコードがダウンロードできるのでダウンロードして比較して見ることをおすすめします。
まぁ、安易に比較するよりも自分で直した方が勉強になるんですが、ここで他の人に任せっきりにするならソースコードを比較したほうが早いです。
※ ちゃんとソースコードの理解とデバッグすれば原因は判明するんですが、それがお望みならデバッグ方法をレクチャーします。
まぁ、安易に比較するよりも自分で直した方が勉強になるんですが、ここで他の人に任せっきりにするならソースコードを比較したほうが早いです。
※ ちゃんとソースコードの理解とデバッグすれば原因は判明するんですが、それがお望みならデバッグ方法をレクチャーします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: csvによる敵の制御
比較しましたがどこを間違えているのかわかりません。
先に言っておいた方がよかったのしれませんが
csvの内容を上記のとおりにするとpatternの値が全て0になったかのような動きをします。
このpatternの列をすべて0(直線運動)にして10行目までを1(蛇行する動き)にすると
ほとんどが1の動きをします。(0の動きをするのもある)
先に言っておいた方がよかったのしれませんが
csvの内容を上記のとおりにするとpatternの値が全て0になったかのような動きをします。
このpatternの列をすべて0(直線運動)にして10行目までを1(蛇行する動き)にすると
ほとんどが1の動きをします。(0の動きをするのもある)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: csvによる敵の制御
見つけらないとしたら、ここはちゃんとしたデバッグ方法を身につけましょう。
デバッガで enemy_enter()関数でちゃんと狙った時に狙った移動パターンが代入されているか確認して下さい。
どうなれば正しいかは、ソースコードを理解していれば想像できると思います。
「デバッガの使い方」 ※ ブレークポイントを使います。
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html
デバッガで enemy_enter()関数でちゃんと狙った時に狙った移動パターンが代入されているか確認して下さい。
どうなれば正しいかは、ソースコードを理解していれば想像できると思います。
「デバッガの使い方」 ※ ブレークポイントを使います。
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。