このたびみなさんのおかげで大分プログラミングも進みいよいよステージを作ろうかというところまできました。
ここでまたもや障害にぶち当たりました。
弾幕を作ってそれを雑魚に撃たせるプログラム自体は滞りなく動いたのですが、雑魚を大量に登場させたとき弾幕が正常に動作しませんでした。
どうやらある雑魚を倒した直後に別の雑魚が弾を撃つ命令があると、倒した雑魚の座標から弾が発射されるようです。(うまく説明できません。すみません)
単体で登場させたときや、同じ弾幕の敵の場合そのようなことは起こらなかったです。
原因がさっぱりですのでご助力をお願いします。
以下ソースです。例によって関係ありそうなところだけピックアップしています。大筋は龍神録プログラミングの館さんの内容と変わっていません。
私のPCとの相性のせいかただ今とてもBBCodeが見にくくなっているのでろくに整理してないコードですがどうかご容赦ください。
//enemy.cpp ショットを撃つ部分と撃破処理に関わるところ
void enter_shot(int i)
{
int j;
for(j=0;j<BARRAGE_MAX;j++)
{
if(shot[j].flag==0)
{
memset(&shot[j],0,sizeof(shot_t));
shot[j].flag=1;
shot[j].kind=enemy[i].bakind;
shot[j].ID=i;
shot[j].count=0;
return;
}
}
}
void enemy_act()
{
int i;
for(i=0;i<ENEMY_MAX;i++)
{
if(enemy[i].flag==1)
{
if(0<=enemy[i].pattern&&enemy[i].pattern<ENEMY_PATTERN_MAX)
{
enemy_pattern[enemy[i].pattern](i);
enemy[i].x+=cos(enemy[i].angle)*enemy[i].speed;
enemy[i].y+=sin(enemy[i].angle)*enemy[i].speed;
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].count++;
if(enemy[i].direction==1)//right
enemy[i].img=12*enemy[i].color+(enemy[i].count/10)%4+8;
if(enemy[i].direction==2)//left
enemy[i].img=12*enemy[i].color+(enemy[i].count/10)%4+8;
if(enemy[i].direction==0)//front
enemy[i].img=12*enemy[i].color+(enemy[i].count/10)%4;
if(enemy[i].x<-30||FIELD_MAX_X+30<enemy[i].x||enemy[i].y<-30||FIELD_MAX_Y+30<enemy[i].y)
{
enemy[i].flag=0;
}
if(enemy[i].batime==enemy[i].count)
{
enter_shot(i);
}
}else{
printfDx("enemy[i].pattern error!",enemy[i].pattern);
}
}
}
}
//out.cpp enemy_death_judge関数がint型の理由は後で説明します
int enemy_death_judge(int s)
{
int i;
if(enemy[s].hp>=enemy[s].hp_max/5)
{
se_flag[11]=1;
return 0;
}
if(enemy[s].hp<enemy[s].hp_max/5&&enemy[s].hp>0)
{
se_flag[12]=1;
return 0;
}
if(enemy[s].hp<0)
{
enemy[s].flag=0;
se_flag[14]=1;
enter_del_effect(s);
for(i=0;i<BARRAGE_MAX;i++)
{
if(shot[i].flag!=0)
{
if(s==shot[i].ID)
{
shot[i].flag=2;
}
}
}
return 1;
}
return -1;
}
void cshot_and_enemy()
{
int i,s;
for(i=0;i<CSHOT_MAX;i++)
{
if(cshot[i].flag>0)
{
for(s=0;s<ENEMY_MAX;s++)
{
if(enemy[s].flag>0)
{
if(out_judge_cshot(i,s))
{
cshot[i].flag=0;
enemy[s].hp-=cshot[i].power;
enemy_death_judge(s);
}
}
}
}
}
}
またもう一つ質問があるのですが龍神録のコードで撃ち返し弾を実装するにはどうすればいいですか。
enemy_death_judge関数がint型なのもそれのための悪あがきの名残です。このままではバグるので消去する予定です。
上記のような感じでいけそうだったんですけどダメでした。