完成品はこんな感じです。
前回のゲーム ギャラクシアンもどきをつくるでは自機を移動させ、弾丸を発射するところまでやりました。
次に敵をつくります。ところでギャラクシアンは敵のことではありません。Wikipediaによると
タイトルの「ギャラクシアン」とは銀河系の住人である人類、つまりプレイヤー側のことを指す言葉である
とのことです。またギャラクシアンの後継として登場したギャラガは銀河(銀河系)を意味する「ギャラクシー」+「蛾」の造語でこちらは敵キャラのようです。
それでは敵キャラを出現させる方法を考えていきましょう。
敵を出現させる
最初に敵をつくって上部に整列させる必要があります。ピクチャーボックスを使うのですが、そのまま使うのではなく継承して使います。敵にはさまざまなデータ(種類や攻撃パターン)があり、これらをデータとして持たせるには継承したほうがわかりやすいと考えました。
| 1 2 3 4 | public class Enemy : PictureBox { } | 
それから敵キャラをまとめて管理するクラスをつくります。
| 1 2 3 4 | public class EnemyManager { } | 
敵は3種類あります。とりあえず色違いで3つ。上段にいる敵は高得点にします。それから敵ははじめ上空で待機していて、ときどき弾丸を撃ちながら降下して攻撃を仕掛けてきます。そのためどのような状態にあるのか、EnemyStatusをみればわかるようにしました。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public enum EnemyStatus {     Standby = 0,     Attack1 = 1, } public class Enemy : PictureBox {     int _id = 0;     EnemyStatus EnemyStatus = EnemyStatus.Standby;     public int Type     {         get { return _id; }     }     public static Enemy CreateEnemy(int x, int y, int width, int height, int type, Image image, Panel panel)     {         Enemy enemy = new Enemy();         enemy.Size = new Size(width, height);         enemy.Location = new Point(x, y);         enemy.Parent = panel;         enemy.Image = image;         enemy.SizeMode = PictureBoxSizeMode.StretchImage;         enemy._id = id;         return enemy;     } } | 
これで敵を表示させることができます。
敵を整列させた状態で出現させる必要があるときは
- ゲームスタートのとき
- ステージクリアして次のステージに進むとき
この2つではないかと思われます。だからForm1クラスのメソッドで作成してしまいましょう。敵それぞれにIDをつけています。
そしてすべての敵を生成したらEnemyManagerに管理させます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public Form1() {     public void CreateEnemies()     {         List<Enemy> vs = new List<Enemy>();         int y = 10;         for (int i = 0; i < 4; i++)         {             int x = 30;             for (int j = 0; j < 8; j++)             {                 Image image = null;                 int id = i*100 + j;                 if (id < 100)                     image = pictureBoxEnemy3.Image;                 else if (id  < 200)                     image = pictureBoxEnemy2.Image;                 else                     image = pictureBoxEnemy1.Image;                 Enemy enemy = Enemy.CreateEnemy(x, y, ENEMY_WIDTH, ENEMY_HEIGHT, id, image, panel1);                 vs.Add(enemy);                 x += 40;             }             y += 40;         }         EnemyManager.Enemies = vs;     } } public class EnemyManager {     static List<Enemy> _enemies = new List<Enemy>();     static public List<Enemy> Enemies     {         get {             _enemies = _enemies.Where(x => !x.IsDisposed).ToList();             return _enemies;         }         set {             _enemies.Clear();             _enemies = value;         }     } } | 
これで敵を表示することができました。そのあと敵を動かす必要があります。

敵を移動させる
自機の弾丸をタイマーをつかって移動させていますが、同じように敵も移動させます。タイマーイベントで扱うこととして
- 自機の移動
- 自機から発射された弾丸の移動
- 待機中の敵の移動
- 敵を待機状態から攻撃状態へ移行させる
- 攻撃状態にある敵の移動と弾丸の発射
- 敵の弾丸の移動
- あたり判定
があります。
上の2つは終わったので「待機中の敵の移動」をプログラミングしていきます。
が、ちょっと長くなったので次回!
