シューティングゲームの館では、敵の出現するタイミングをcounterの値を元にswitch文で制御していますが
その方法で、敵を全く同じタイミングで出現させるにはどうしたら良いでしょうか?
1日考えてあれこれ試してみましたが、どうもうまくいきません。
ヒントでもいいので誰か教えてくれるとうれしいです。
シューティングでの敵の同時出現
Re:シューティングでの敵の同時出現
複数の敵が同じcounterの時期に出現する、ということですよね。
STG館の12章にある関数EnemyCalc()を使ってらっしゃるとすれば、
void EnemyCalc(){
int i;
switch(counter){
case 100:
case 150:
case 200:
case 250:
// 一体目の敵出現
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
enemy.flag=1; //出現フラグを立てる
enemy.counter=0;//出現して何カウント目か測るカウンター初期化
enemy.pattern=1; //どういう軌道を描くか
enemy.size=0.5f;//敵の大きさ
enemy.x=100.0; //xの初期座標
enemy.y=-10.0; //yの初期座標
// 二体目の敵出現
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
enemy.flag=1;
enemy.counter=0;
enemy[i].pattern=1;
enemy[i].size=0.5f;
enemy[i].x=200.0; // ここだけ、同じ出現位置で出すとマズいでしょうから、勝手に200にしました
enemy[i].y=-10.0;
break;
default:
break;
}
}
このようにすると、上手くいくと思います。
更に突っ込んでしまいますけど、
for(i=0;i<100;i++)
if(enemy[i].flag==0)
break;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].pattern=1;
enemy[i].size=0.5f;
enemy[i].x=200.0; // ここだけ、同じ出現位置で出すとマズいでしょうから、勝手に200にしました
enemy[i].y=-10.0;
という部分のうち、for文とflagとcounterのところは、どんな敵を出現させるとしても同じ動作になると思います(違ったらすいません)。
ですので、
・pattern:動きのパターン
・size:敵の大きさ
・x:x座標
・y:y座標
を引数とした関数でも作ってあげると、楽になると思います。
製作頑張って下さいね。
STG館の12章にある関数EnemyCalc()を使ってらっしゃるとすれば、
void EnemyCalc(){
int i;
switch(counter){
case 100:
case 150:
case 200:
case 250:
// 一体目の敵出現
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
enemy.flag=1; //出現フラグを立てる
enemy.counter=0;//出現して何カウント目か測るカウンター初期化
enemy.pattern=1; //どういう軌道を描くか
enemy.size=0.5f;//敵の大きさ
enemy.x=100.0; //xの初期座標
enemy.y=-10.0; //yの初期座標
// 二体目の敵出現
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
enemy.flag=1;
enemy.counter=0;
enemy[i].pattern=1;
enemy[i].size=0.5f;
enemy[i].x=200.0; // ここだけ、同じ出現位置で出すとマズいでしょうから、勝手に200にしました
enemy[i].y=-10.0;
break;
default:
break;
}
}
このようにすると、上手くいくと思います。
更に突っ込んでしまいますけど、
for(i=0;i<100;i++)
if(enemy[i].flag==0)
break;
enemy[i].flag=1;
enemy[i].counter=0;
enemy[i].pattern=1;
enemy[i].size=0.5f;
enemy[i].x=200.0; // ここだけ、同じ出現位置で出すとマズいでしょうから、勝手に200にしました
enemy[i].y=-10.0;
という部分のうち、for文とflagとcounterのところは、どんな敵を出現させるとしても同じ動作になると思います(違ったらすいません)。
ですので、
・pattern:動きのパターン
・size:敵の大きさ
・x:x座標
・y:y座標
を引数とした関数でも作ってあげると、楽になると思います。
製作頑張って下さいね。
Re:シューティングでの敵の同時出現
丁寧な解説ありがとうございました。おかげで敵を同時に出すことが出来ました。
それで、もう一つ質問があるのですがよろしいでしょうか?
シューティングゲームの館のプログラムを元に、敵が消えると弾を撃つのをやめるようにしたのですが
そのすると場合によっては、敵が消えた後、別の敵が打つときに全然違う場所からショットがでるようなことが起こってしまいました。(玉の出る場所は敵の中心から出るようにしています。)
正直何が原因なのかもさっぱりなので、わかる人がいたらどうか教えてください。
それで、もう一つ質問があるのですがよろしいでしょうか?
シューティングゲームの館のプログラムを元に、敵が消えると弾を撃つのをやめるようにしたのですが
そのすると場合によっては、敵が消えた後、別の敵が打つときに全然違う場所からショットがでるようなことが起こってしまいました。(玉の出る場所は敵の中心から出るようにしています。)
正直何が原因なのかもさっぱりなので、わかる人がいたらどうか教えてください。
Re:シューティングでの敵の同時出現
私も以前同じようなところで悩んでましたね…
敵呼び出し部分には
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
敵ショットパターン呼び出し部分には
for(i=0;i<ENEMY_SHOT_NUM;i++)//記憶が曖昧…
if(EnemyShot.flag==0)
break;
とありますがおそらくショットパターンのiと敵のiを同じと勘違いしてると思ったのですが…
この敵番号のiの値をショットパターンの構造体に変数を用意して記憶しておけば良いと思います
EnemyShot.e_numなど
これを上に書いてある敵ショットパターン呼び出し部分に
EnemyShot.e_num = i;
を追加してやるとできるかと
(これ以外の原因でしたらすみません)
敵が消えたときに撃たないようにするにはショットパターンのところで
if(EnemyShot.counter==0&&enemy[EnemyShot.e_num].hp>0)
を追加してやるとできるかも、です
敵呼び出し部分には
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
敵ショットパターン呼び出し部分には
for(i=0;i<ENEMY_SHOT_NUM;i++)//記憶が曖昧…
if(EnemyShot.flag==0)
break;
とありますがおそらくショットパターンのiと敵のiを同じと勘違いしてると思ったのですが…
この敵番号のiの値をショットパターンの構造体に変数を用意して記憶しておけば良いと思います
EnemyShot.e_numなど
これを上に書いてある敵ショットパターン呼び出し部分に
EnemyShot.e_num = i;
を追加してやるとできるかと
(これ以外の原因でしたらすみません)
敵が消えたときに撃たないようにするにはショットパターンのところで
if(EnemyShot.counter==0&&enemy[EnemyShot.e_num].hp>0)
を追加してやるとできるかも、です