C++での乱射ショットについて教えてください。
お疲れ様です。
今回もお世話になります。
シューティングゲームのサンプルで勉強しています。
サンプルの乱射ショットの実行画面では弾が20発くらい
一度に乱射した状態で発射します。
自分の実行画面は1~2発、画面から後退するときに
もう1~2発発射するだけです。
自分なりにコードを足してみたりしたのですが
2くらい増えただけで乱射になりません。
まだ理解不足で出来ませんでした。
何が足りないか教えてください。
以下は乱射部分だけのコードです。
その下にENEMY::Shot()の全体のコードを載せます。
失礼します。
//乱射ショット
case 3:
//1ループ毎に1発発射
for(int i=0;i<ENEMY_SNUM;++i){
//フラグが立ってない弾を探して、座標セット
if(shot[i].flag==false){
shot[i].flag=true;
shot[i].x=x;
shot[i].y=y;
//初回だけ乱数初期化
if(num==0){
srand((unsigned int)time(NULL));
shot[i].rad=atan2(py-y,px-x)-(60*PI/180)+((rand()%120)*PI/180);
++num;
break;
}
}
}
break;
以下はENEMY::Shot()の全体のコードです。
void ENEMY::Shot()
{
//CONTROLクラスの参照
CONTROL &control = CONTROL::GetInstance();
double px,py;
//発射タイミングになったら、フラグを立てる
if(shot_time==g_count){
sflag=true;
}
//フラグを立てるときだけ
if(sflag){
//プレイヤーの一取得
control.GetPlayerPosition(&px,&py);
//敵とプレイヤーとの座標の差から逆正接を求める。
//初回だけ実行
if(scount==0)
rad=atan2(py-y,px-x);
switch(s_pattern){
//前方にショット
case 0:
//5回に一回発射。20までなので5発発射。
if(scount%5==0 && scount<=20){
for(int i=0;i<ENEMY_SNUM;++i){
//フラグが立ってない弾を探して、座標をセット
f(shot[i].flag==false){
shot[i].flag=true;
shot[i].x=x;
shot[i].y=y;
shot[i].rad=rad;
break;
}
}
}
break;
//プレイヤーに向かって直線ショット
case 1:
//6ループに一回発射。54までなので10発発射。
if(scount%6==0 && scount<=54){
for(int i=0;i<ENEMY_SNUM;++i){
//フラグが立っていない弾を探して、座標をセット
if(shot[i].flag==false){
shot[i].flag=true;
shot[i].x=x;
shot[i].y=y;
shot[i].rad=rad;
break;
}
}
}
break;
//3直線ショット
case 2:
//10ループに一回発射。1ループに3発なので5ループさせると15発発射
if(scount%10==0 && scount<=40){
for(int i=0;i<ENEMY_SNUM;++i){
//フラグが立っていない弾を探して、座標等をセット
if(shot[i].flag==false){
shot[i].flag=true;
shot[i].x=x;
shot[i].y=y;
//0の時は左より
if(num==0){
//敵とプレイヤーとの逆正接から10度引いたラジアンを代入
shot[i].rad=rad-(10*3.14/180);
//1の時はプレイヤー一直線
}else if(num==1){
//敵とプレイヤーとの逆正接を代入
shot[i].rad=rad;
//2の時は右より
}else if(num==2){
//敵とプレイヤーとの逆正接から10度足したラジアンを代入
shot[i].rad=rad+(10*PI/180);
}
++num;
//3発発射したら,numを0にしてループを抜ける。
if(num==3){
num=0;
break;
}
}
}
}
break;
//乱射ショット
case 3:
//1ループ毎に1発発射
for(int i=0;i<ENEMY_SNUM;++i){
//フラグが立ってない弾を探して、座標セット
if(shot[i].flag==false){
shot[i].flag=true;
shot[i].x=x;
shot[i].y=y;
//初回だけ乱数初期化
if(num==0){
srand((unsigned int)time(NULL));
shot[i].rad=atan2(py-y,px-x)-(60*PI/180)+((rand()%120)*PI/180);
++num;
break;
}
}
}
break;
}
//フラグが立ってる弾の数
int s=0;
//フラグが立ってる弾だけ、弾の移動を行う
for(int i=0;i<ENEMY_SNUM;++i){
if(shot[i].flag){
switch(shot[i].pattern){
//単純に下に発射
case0:
shot[i].y+=shot[i].speed;
break;
case 1:
shot[i].x+=shot[i].speed*cos(shot[i].rad);
shot[i].y+=shot[i].speed*sin(shot[i].rad);
break;
case 2:
shot[i].x+=shot[i].speed*cos(shot[i].rad);
shot[i].y+=shot[i].speed*sin(shot[i].rad);
break;
case 3:
shot[i].x+=shot[i].speed*cos(shot[i].rad);
shot[i].y+=shot[i].speed*sin(shot[i].rad);
break;
}
//弾が画面をはみ出たらフラグを戻す。
if(ShotOutCheck(i)){
shot[i].flag=false;
continue;
}
++s;
}
}
//sがゼロということは発射中の弾がない。
//かつdeadflagがTRUEということはこの敵のクラスは消滅させてよい
if(s==0 && deadflag){
//敵クラス消滅フラグをTRUEにする
endflag=true;
}
++scount;
}
}
補足
相手は2人でパソとボーダフォンです><