龍神録の13章で
Posted: 2010年9月11日(土) 12:42
以前に質問した者ですが龍神録の13章で14章のばらまきショットを撃ちたいのですが
うまく動作してくれません。
コードはほぼ例と同じなのですが・・・
for(i=0;i<SHOT_MAX;i++){//弾幕データ計算
//フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
if(enemy.bltime==enemy.cnt){
enter_shot(i);
}
if(shot.flag!=0 && 0<=shot.knd && shot.knd<SHOT_KND_MAX){
shot_bullet[shot.knd](i);//.kndの弾幕計算関数を呼ぶ関数ポインタ
shot_calc(i);//i番目の弾幕を計算
}
if(shot.flag>0){//弾幕データがオンなら
for(j=0;j<SHOT_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(shot.bullet2[j].flag!=0){//弾データがオンなら
DrawRotaGraphF(
shot.bullet2[j].x, shot.bullet2[j].y,
1.0, shot[i].bullet2[j].angle+PI/2,
img_bullet[shot[i].bullet2[j].knd][shot[i].bullet2[j].co[/url],TRUE);
}
}}}
//////////↓ヘッダーファイル//////////////
//ショット登録
void enter_shot(int i){
int j;
for(j=0;j<SHOT_MAX;j++){//フラグのたって無いenemyを探す
memset(&shot[j],0,sizeof(shot_t));//初期化して登録
shot[j].flag=1;//フラグをたてる
shot[j].knd=enemy[j].blknd;//弾の種類
shot[j].num=i;//num=どの敵から発射されたものか。
shot[j].cnt=0;
return ;
}
}
//n番目のショットを登録した敵と自機との角度を返す
extern int PlayerX, PlayerY;
double shotatan2(int n);
double shotatan2(int n,int PlayerX,int PlayerY){
return atan2(PlayerY-enemy[shot[n].num].y,PlayerX-enemy[shot[n].num].x);
}
//空いている弾を探す
int shot_search(int n){
int i;
for(i=0;i<SHOT_BULLET_MAX;i++){
if(shot[n].bullet2[i].flag==0){
return i;
}
}
return -1;
}
void shot_calc(int n){
int i,max=0;
if(enemy[shot[n].num].flag!=1)//敵が倒されたら
shot[n].flag=2;//それ以上ショットを登録しないフラグに変える
for(i=0;i<SHOT_BULLET_MAX;i++){//n番目の弾幕データの弾を計算
if(shot[n].bullet2[i].flag>0){//その弾が登録されていたら
shot[n].bullet2[i].x+=cos(shot[n].bullet2[i].angle)*shot[n].bullet2[i].spd;
shot[n].bullet2[i].y+=sin(shot[n].bullet2[i].angle)*shot[n].bullet2[i].spd;
shot[n].bullet2[i].cnt++;
}
}
//現在表示中の弾が一つでもあるかどうか調べる
for(i=0;i<SHOT_BULLET_MAX;i++)
if(shot[n].bullet2[i].flag>0)
return;
if(enemy[shot[n].num].flag!=1){
shot[n].flag=0;//終了
enemy[shot[n].num].flag=0;
}
}
//100カウント中に10発、自機に向かって直線発射(常に自機狙い)
void shot_bullet_H001(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<100 && t%10==0){//100カウント中10カウントに1回
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){//敵がいて、弾が登録可能なら
shot[n].bullet2[k].knd =enemy[shot[n].num].blknd2;//弾登録
shot[n].bullet2[k].angle =shotatan2(n,PlayerX,PlayerY);//角度
shot[n].bullet2[k].flag =1;//フラグ
shot[n].bullet2[k].x =enemy[shot[n].num].x;//座標
shot[n].bullet2[k].y =enemy[shot[n].num].y;
shot[n].bullet2[k].col =enemy[shot[n].num].col;//色
shot[n].bullet2[k].cnt =0;//カウンタ
shot[n].bullet2[k].spd =3;//スピード
se_flag[0]=1;
}
}
}
うまく動作してくれません。
コードはほぼ例と同じなのですが・・・
for(i=0;i<SHOT_MAX;i++){//弾幕データ計算
//フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
if(enemy.bltime==enemy.cnt){
enter_shot(i);
}
if(shot.flag!=0 && 0<=shot.knd && shot.knd<SHOT_KND_MAX){
shot_bullet[shot.knd](i);//.kndの弾幕計算関数を呼ぶ関数ポインタ
shot_calc(i);//i番目の弾幕を計算
}
if(shot.flag>0){//弾幕データがオンなら
for(j=0;j<SHOT_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
if(shot.bullet2[j].flag!=0){//弾データがオンなら
DrawRotaGraphF(
shot.bullet2[j].x, shot.bullet2[j].y,
1.0, shot[i].bullet2[j].angle+PI/2,
img_bullet[shot[i].bullet2[j].knd][shot[i].bullet2[j].co[/url],TRUE);
}
}}}
//////////↓ヘッダーファイル//////////////
//ショット登録
void enter_shot(int i){
int j;
for(j=0;j<SHOT_MAX;j++){//フラグのたって無いenemyを探す
memset(&shot[j],0,sizeof(shot_t));//初期化して登録
shot[j].flag=1;//フラグをたてる
shot[j].knd=enemy[j].blknd;//弾の種類
shot[j].num=i;//num=どの敵から発射されたものか。
shot[j].cnt=0;
return ;
}
}
//n番目のショットを登録した敵と自機との角度を返す
extern int PlayerX, PlayerY;
double shotatan2(int n);
double shotatan2(int n,int PlayerX,int PlayerY){
return atan2(PlayerY-enemy[shot[n].num].y,PlayerX-enemy[shot[n].num].x);
}
//空いている弾を探す
int shot_search(int n){
int i;
for(i=0;i<SHOT_BULLET_MAX;i++){
if(shot[n].bullet2[i].flag==0){
return i;
}
}
return -1;
}
void shot_calc(int n){
int i,max=0;
if(enemy[shot[n].num].flag!=1)//敵が倒されたら
shot[n].flag=2;//それ以上ショットを登録しないフラグに変える
for(i=0;i<SHOT_BULLET_MAX;i++){//n番目の弾幕データの弾を計算
if(shot[n].bullet2[i].flag>0){//その弾が登録されていたら
shot[n].bullet2[i].x+=cos(shot[n].bullet2[i].angle)*shot[n].bullet2[i].spd;
shot[n].bullet2[i].y+=sin(shot[n].bullet2[i].angle)*shot[n].bullet2[i].spd;
shot[n].bullet2[i].cnt++;
}
}
//現在表示中の弾が一つでもあるかどうか調べる
for(i=0;i<SHOT_BULLET_MAX;i++)
if(shot[n].bullet2[i].flag>0)
return;
if(enemy[shot[n].num].flag!=1){
shot[n].flag=0;//終了
enemy[shot[n].num].flag=0;
}
}
//100カウント中に10発、自機に向かって直線発射(常に自機狙い)
void shot_bullet_H001(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<100 && t%10==0){//100カウント中10カウントに1回
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){//敵がいて、弾が登録可能なら
shot[n].bullet2[k].knd =enemy[shot[n].num].blknd2;//弾登録
shot[n].bullet2[k].angle =shotatan2(n,PlayerX,PlayerY);//角度
shot[n].bullet2[k].flag =1;//フラグ
shot[n].bullet2[k].x =enemy[shot[n].num].x;//座標
shot[n].bullet2[k].y =enemy[shot[n].num].y;
shot[n].bullet2[k].col =enemy[shot[n].num].col;//色
shot[n].bullet2[k].cnt =0;//カウンタ
shot[n].bullet2[k].spd =3;//スピード
se_flag[0]=1;
}
}
}