私が困っているのは、シューティングゲームの館での20章の”色々試してテストしよう。”のcaseにより、敵をたくさん出現させて弾を撃たせるところで、敵が撃った弾が一つでも自分の決めた範囲を越えると、次の新しい敵が撃った弾は音のみで表示されなくなります。
例えば
case 200: //このときの敵の弾は音もあり弾の画像も表示される
case 300: //このときの敵の弾が決められている範囲を越える、状態はcase 200に同じ
case 400: //このときの敵の弾は音のみで弾の画像が表示されない
この場合範囲をいくら大きくしてもいずれ弾は範囲に到達してしまいます。そこで範囲を大きくせずに何度もcaseによって敵が弾を発射可能な方法はありませんでしょうか?(>_<")
自分では敵の弾発射パターンをたくさん作り、敵の数に比例して行数が増える(一つのパターンにcaseを一つしか使用しない)非常に非効率的な方法しか考えつきませんでしたので質問させていただきました。
弾の発射について
Re:弾の発射について
まずEnemyPattern関数で以下を指定し
EnemyShot[j].mem_ex=enemy.x;
EnemyShot[j].mem_ey=enemy.y;
次にEnemyShotPattern関数で敵の座標を弾の初期座標に指定しているみたいです。
EnemyShot.EnemyShots[0].x=EnemyShot.mem_ex;
EnemyShot.EnemyShots[0].y=EnemyShot.mem_ey;
>>>次の新しい敵が撃った弾は音のみで表示されなくなります。
と、ありますが少し説明不足でした。正確には敵が弾を撃った瞬間に、弾が敵の初期座標から発射されていることは確認できます。 しかし自機を狙ってくるかと思いきや、1秒かからないうちに消えます。サウンドが鳴っているので弾の画像だけが表示されなくなるというのはよく分かりません><
ここが悪いのでしょうか?
void EnemyShotControl(){//ショットパターン1を呼ぶための関数enemy.cppのEnemyControl関数と役目一緒
int i;
for(i=0;i<ENEMY_TOTAL_NUM;i++){//敵の最大数100体だけループ
if(EnemyShot.flag==1){//ショットしている玉があれば
if(EnemyShot.pattern==1)//しかもそれがショットパターン1ならば
EnemyShotPattern1(i);//ショットパターン1へ
if(EnemyShot.pattern==3)//しかもそれがショットパターン3ならば
EnemyShotPattern3(i);//ショットパターン3へ
}
}
}
-----------------------------------------------------------------------------------
if(EnemyShot.pattern==3)//しかもそれがショットパターン3ならば
EnemyShotPattern3(i);//ショットパターン3へ
を消したときは弾はしっかり表示されました。消さなかったときは弾は表示できなくなります。
以上のソースは別々に書く必要があるということでしょうか?
pattern1には17節の敵に弾を発射させる。(概念説明)、pattern3には24節の時間差ショット。を使わせてもらってます。pattern1はpattern3を書かなければ正常に動作します。しかし書いてしまうと画像が表示されなくなります。pattern3のみ書いた場合も範囲を越えると画像が表示されなくなります。
以上のことから連続で敵が弾を撃つことができないということが分かりました。24節の時間差ショットのように
for(int j=0;j<10;j++)のような連続で10回弾を撃つfor文を使用すると正常に動作しなくなります。
EnemyShot[j].mem_ex=enemy.x;
EnemyShot[j].mem_ey=enemy.y;
次にEnemyShotPattern関数で敵の座標を弾の初期座標に指定しているみたいです。
EnemyShot.EnemyShots[0].x=EnemyShot.mem_ex;
EnemyShot.EnemyShots[0].y=EnemyShot.mem_ey;
>>>次の新しい敵が撃った弾は音のみで表示されなくなります。
と、ありますが少し説明不足でした。正確には敵が弾を撃った瞬間に、弾が敵の初期座標から発射されていることは確認できます。 しかし自機を狙ってくるかと思いきや、1秒かからないうちに消えます。サウンドが鳴っているので弾の画像だけが表示されなくなるというのはよく分かりません><
ここが悪いのでしょうか?
void EnemyShotControl(){//ショットパターン1を呼ぶための関数enemy.cppのEnemyControl関数と役目一緒
int i;
for(i=0;i<ENEMY_TOTAL_NUM;i++){//敵の最大数100体だけループ
if(EnemyShot.flag==1){//ショットしている玉があれば
if(EnemyShot.pattern==1)//しかもそれがショットパターン1ならば
EnemyShotPattern1(i);//ショットパターン1へ
if(EnemyShot.pattern==3)//しかもそれがショットパターン3ならば
EnemyShotPattern3(i);//ショットパターン3へ
}
}
}
-----------------------------------------------------------------------------------
if(EnemyShot.pattern==3)//しかもそれがショットパターン3ならば
EnemyShotPattern3(i);//ショットパターン3へ
を消したときは弾はしっかり表示されました。消さなかったときは弾は表示できなくなります。
以上のソースは別々に書く必要があるということでしょうか?
pattern1には17節の敵に弾を発射させる。(概念説明)、pattern3には24節の時間差ショット。を使わせてもらってます。pattern1はpattern3を書かなければ正常に動作します。しかし書いてしまうと画像が表示されなくなります。pattern3のみ書いた場合も範囲を越えると画像が表示されなくなります。
以上のことから連続で敵が弾を撃つことができないということが分かりました。24節の時間差ショットのように
for(int j=0;j<10;j++)のような連続で10回弾を撃つfor文を使用すると正常に動作しなくなります。
Re:弾の発射について
EnemyPattern1関数の
if(enemy.counter==75)の部分を
if(enemy.counter%75==0)などとしてShotPattern1だけ設定するとどうなるのでしょうか
弾が見えないということは弾のフラグが0になったか画面外に描画しているかのどちらかと思うのですが…
pattern3に原因が見当たらないのでしたら、
弾のフラグ、座標に関係ある部分に絞って見てみるといいかもしれません
それと少し引っかかっていたのですが"自分の決めた範囲"というのは
EnemyShotCalcDisp関数の"弾が画面より外にあるときは発射フラグを戻す"という部分でしょうか
こちらはあまり関係ないですがEnemyControl関数で
if(EnemyShot.pattern==3)を
else if(EnemyShot.pattern==3)
とelseを追加した方がいいかも、です
また、今は考えなくてもいいですが関数のポインタを利用するとすっきりしますので参考程度に
if(enemy.counter==75)の部分を
if(enemy.counter%75==0)などとしてShotPattern1だけ設定するとどうなるのでしょうか
弾が見えないということは弾のフラグが0になったか画面外に描画しているかのどちらかと思うのですが…
pattern3に原因が見当たらないのでしたら、
弾のフラグ、座標に関係ある部分に絞って見てみるといいかもしれません
それと少し引っかかっていたのですが"自分の決めた範囲"というのは
EnemyShotCalcDisp関数の"弾が画面より外にあるときは発射フラグを戻す"という部分でしょうか
こちらはあまり関係ないですがEnemyControl関数で
if(EnemyShot.pattern==3)を
else if(EnemyShot.pattern==3)
とelseを追加した方がいいかも、です
また、今は考えなくてもいいですが関数のポインタを利用するとすっきりしますので参考程度に