完成品はこんな感じです。
前回のゲーム ギャラクシアンもどきをつくるでは自機を移動させ、弾丸を発射するところまでやりました。
次に敵をつくります。ところでギャラクシアンは敵のことではありません。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つは終わったので「待機中の敵の移動」をプログラミングしていきます。
が、ちょっと長くなったので次回!