Cで説明します。他の言語でも考え方は一緒です。
やり方は、いろいろありますので、初心者の方にもわかりやすい方法を紹介します。
以下①, ②を配列にします。配列の要素数 BULLET_MAX を増やせば画面上に同時出る弾の数を増やせます。
①弾がアクティブかどうか(画面上に出ているかどうか) ・・・FALSE で初期化します。
bool bullet_is_active[BULLET_MAX];
とし、
は 0番目の弾が画面上に出ているかどうかを表すことにします。true で出ている、false で出ていない、です。
・弾の座標も同じように配列にします。
double bullet_x[BULLET_MAX];
double bullet_y[BULLET_MAX];
とし、
は0番目の弾の画面上の座標を表すことにします。
簡単のために、配列を分けましたが、普通は、is_active, x, y の構造体を定義して、構造体配列にするのが一般的かとおもいます。
●弾の発射は以下のように行います。
発射ボタンが押されたら、
もしアクティブでない状態(画面に出ていない状態)の弾があれば、弾を画面に出す、
ということをします。
具体的には、bullet_is_active を for で順次調べていき、
FALSE な弾があれば、その弾を TRUE にし、弾の座標を自機の座標にする
ということをします。
そうすれば、すべての弾が TRUE で画面に出ている状態なら、
いくら発射ボタンを押しても弾はでません。
●メインループの中では、常に、弾を動かします。
もしアクティブ状態(画面に出ている状態)の弾があれば、弾を動かす、
ということをします。
具体的には、bullet_is_active を for で順次調べていき、
TRUE なら、弾を動かします。
インベーダーゲームのような弾の動かし方なら、弾のY座標を一定数引けばいいですね
(画面の上端をY=0と想定)
メインループを何度も通るたびに、Y座標が減っていくので、
弾が上に動いていくように見えます。
次に、弾の消滅です。
弾の座標を動かしたときは、画面の端に行ったかをチェックします。
インベーダーゲームの場合は、Y<0 となったら、弾が画面の上端まで行ったので消滅させます。
消滅は、bullet_is_active を FALSE にするだけです。
さて、実装してみればわかりますが、発射ボタンを押すと、メインループを通るたびに弾が出てしまうので、連続して弾が出てしまいます。
「発射ボタンが押されたら、弾を出す」と書きましたが、厳密には、
前回弾が発射されてから、しばらくの間は弾が出ないようにするとか、
弾の発射条件を「ボタンを離した状態から、押した状態に移行したら」とするなどの工夫が要ります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。