では敵機を作成しましたが、今回は2つめの敵を作成します。前回同様EnemyBaseクラスを継承して作成します。
黄色いやさぐれひよこを使いますが、これもプログラミング講座 第31回【シューティングゲーム作成(11)/JavaScript】のマネをして動きを変えます。横に大きく動くようにして1回弾丸を命中させただけでは死なないようにします。
CharacterクラスにはLifeプロパティがあります。Lifeプロパティを変更したときに0以下になった場合はIsDeadをtrueに変更されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Character { public int Life { get { return _life; } set { _life = value; if(_life <= 0) IsDead = true; } } } |
そこで弾丸が命中したらLifeをひとつ減らします。Enemy2クラスのコンストラクタにLifeの値をどうするか引数で渡せるようになっていますが、1よりも大きな値を渡せば「硬い敵」をつくることができます。
ではEnemy2クラスをみてみましょう。テクスチャが複数あるので動くと描画のされ方が微妙にかわります。手がパタパタ動きます。
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
using OpenTK; using OpenTK.Graphics.OpenGL; class Enemy2 : EnemyBase { public Enemy2(float x, float y, float radius, int life, int score) { X = x; Y = y; IsDead = false; Score = score; Life = life; Radius = radius; if(Textures.Count == 0) Textures = CreateTextures(); } static List<int> Textures = new List<int>(); protected override List<Bitmap> GetBitmaps() { Bitmap bitmap = Properties.Resources.sprite2; List<Bitmap> bitmaps = new List<Bitmap>(); // ザコ敵(黄色)0 { Bitmap bitmap1 = new Bitmap(25, 28); Graphics g = Graphics.FromImage(bitmap1); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.DrawImage(bitmap, new Rectangle(0, 0, 25, 28), new Rectangle(4, 63, 25, 28), GraphicsUnit.Pixel); g.Dispose(); bitmaps.Add(bitmap1); } // ザコ敵(黄色)1 { Bitmap bitmap1 = new Bitmap(25, 28); Graphics g = Graphics.FromImage(bitmap1); g.DrawImage(bitmap, new Rectangle(0, 0, 25, 28), new Rectangle(36, 63, 25, 28), GraphicsUnit.Pixel); g.Dispose(); bitmaps.Add(bitmap1); } // ザコ敵(黄色)2 { Bitmap bitmap1 = new Bitmap(25, 28); Graphics g = Graphics.FromImage(bitmap1); g.DrawImage(bitmap, new Rectangle(0, 0, 25, 28), new Rectangle(68, 63, 25, 28), GraphicsUnit.Pixel); g.Dispose(); bitmaps.Add(bitmap1); } // ザコ敵(黄色)3 { Bitmap bitmap1 = new Bitmap(25, 28); Graphics g = Graphics.FromImage(bitmap1); g.DrawImage(bitmap, new Rectangle(0, 0, 25, 28), new Rectangle(99, 63, 25, 28), GraphicsUnit.Pixel); g.Dispose(); bitmaps.Add(bitmap1); } return bitmaps; } public override void Move() { Jiki jiki = Form1.Jiki; if(jiki == null) return; if(MoveCount % 32 == 0 && (Random.Next(2) == 0 || VecX == 0)) { if(jiki.X < X) VecX = -0.05f; else VecX = 0.05f; } base.Move(); Shot(); } void Shot() { if(Random.Next(40) % 40 == 0) { int r = Random.Next(10); Form1.EnemyBurrets.Add(new EnemyBurret(X, Y, r * 0.02f - 0.1f, -0.1f)); } } public override void Draw() { GL.PushMatrix(); { GL.Translate(X, Y, 0); GL.Material(MaterialFace.Front, MaterialParameter.Ambient, Color.White); GL.Material(MaterialFace.Front, MaterialParameter.Diffuse, Color.White); if(MoveCount % 8 < 2) GL.BindTexture(TextureTarget.Texture2D, Textures[0]); else if(MoveCount % 8 < 4) GL.BindTexture(TextureTarget.Texture2D, Textures[1]); else if(MoveCount % 8 < 6) GL.BindTexture(TextureTarget.Texture2D, Textures[2]); else if(MoveCount % 8 < 8) GL.BindTexture(TextureTarget.Texture2D, Textures[3]); GL.Begin(BeginMode.Quads); { GL.Normal3(Vector3.UnitY); GL.TexCoord2(1, 0); GL.Vertex3(Radius, 0, Radius); GL.TexCoord2(0, 0); GL.Vertex3(-Radius, 0, Radius); GL.TexCoord2(0, 1); GL.Vertex3(-Radius, 0, -Radius); GL.TexCoord2(1, 1); GL.Vertex3(Radius, 0, -Radius); } GL.End(); GL.BindTexture(TextureTarget.Texture2D, 0); } GL.PopMatrix(); } } |
新しいタイプの敵機を描画します。CreateEnemies()メソッドのなかでEnemy1だけでなくEnemy2も同時につくります。あとは変更ありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public partial class Form1 : Form { void CreateEnemies() { if(Enemies.Count < 10 && Random.Next(100) % 8 == 1) { int r = Random.Next(800); float x = 1f * r / 100 - 4f; Enemies.Add(new Enemy1(x, BaseY + 40, 0.5f, 1, 50)); // Lifeに 3 を指定 Enemies.Add(new Enemy2(x, BaseY + 40, 0.5f, 3, 50)); } } } |