完成品はこんな感じです。

待機中の敵を移動させる

タイマーイベントが発生したときにすることとして

  • 自機の移動
  • 自機から発射された弾丸の移動
  • 待機中の敵の移動
  • 敵を待機状態から攻撃状態へ移行させる
  • 攻撃状態にある敵の移動と弾丸の発射
  • 敵の弾丸の移動
  • あたり判定

があります。待機状態にある敵を移動させます。待機状態にあるかどうかはEnemyクラスのフィールド変数EnemyStatusをみればわかります。

そして敵X座標の最大値と最小値から端まで移動したか調べて、必要なら移動方向の転換をおこなっています。

それから敵を生成したときに、その座標を記憶し、待機中の敵が移動するとそれに応じてその座標を変化させています。攻撃してきた敵が下までくると、元の位置に戻す必要があります。そのときにこの座標が必要になります。

攻撃に参加する敵を決める

待機中の敵が攻撃にうつるためのメソッドです。

攻撃状態に移行する敵を決める
攻撃は単体か?編隊か?

攻撃を開始するかどうかは1秒ごとに乱数をつかって判定し、攻撃する場合はまた乱数をつかって攻撃に参加する敵を決めます。その攻撃は単体でおこなわれるのか、それとも複数機による編隊攻撃なのかも決めます。

タイマーイベントは50ミリ秒ごとに発生するので、

タイマーイベントの回数をカウントして20で割り切れる場合は1秒

と考えます。

クソ長いメソッドになってしまいましたが、攻撃に参加する敵の候補になるものを調べて乱数をつかって決定しています。攻撃は単体か編隊か、編隊のときはその相手になるものはどれかもあわせて処理をしています。

攻撃中の敵を動かす

AttackEnemiesMoveメソッドで攻撃に参加している敵を動かします。両端にあたると跳ね返って移動します。単純な動きです。

Enemyクラスに attachTime というフィールド変数を追加して、一定間隔で弾丸を発射しています。

敵に弾丸を発射させる

敵に弾丸を発射させるためのメソッドです。敵のタイプによって連射間隔や弾丸のスピードを変化させています。

敵の弾丸の生成はピクチャーボックスではなくそれを継承したクラスを使っています。敵の種類によって弾丸のスピードが違うので、それを管理しやすくするためです。

生成したら EnemyManagerクラスに管理を任せています。

画面の下まで移動した弾丸は Dispose しています。

Timer1_Tickメソッドは以下のようになります。

次回は当たり判定、加点、ミス時の処理などをおこないます。