これまでにつくってきたデジタルインベーダー(MG-880)もどきはあまり見栄えはよくありませんでした。もう少しスタイリッシュにしてみることにします。
Before
After
デザイナ
ピクチャーボックスを貼り付けておきます。これまで使ったコントロールのプロパティも使いますが、見えてしまうと見栄えが悪いので、フォームのサイズ変更をして見えなくしてしまいます。
リソース
ビットマップのリソースを用意します。
プログラムが開始されたらビットマップを読み込みます。そしてコンストラクタ内でピクチャーボックスの初期化を行ないます。初期化の内容は背景を黒色にする、SizeMode プロパティを PictureBoxSizeMode.Zoom に変更することです。
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 |
public partial class Form1 : Form { // 現在はゲームオーバーの状態か? bool isGameOver = true; Bitmap BitmapNumber0 = Properties.Resources.number0; Bitmap BitmapNumber1 = Properties.Resources.number1; Bitmap BitmapNumber2 = Properties.Resources.number2; Bitmap BitmapNumber3 = Properties.Resources.number3; Bitmap BitmapNumber4 = Properties.Resources.number4; Bitmap BitmapNumber5 = Properties.Resources.number5; Bitmap BitmapNumber6 = Properties.Resources.number6; Bitmap BitmapNumber7 = Properties.Resources.number7; Bitmap BitmapNumber8 = Properties.Resources.number8; Bitmap BitmapNumber9 = Properties.Resources.number9; Bitmap BitmapUfo = Properties.Resources.ufo; Bitmap BitmapLife1 = Properties.Resources.life1; Bitmap BitmapLife2 = Properties.Resources.life2; Bitmap BitmapLife3 = Properties.Resources.life3; public Form1() { InitializeComponent(); // サイズ変更できなくする this.FormBorderStyle = FormBorderStyle.FixedSingle; this.MaximizeBox = false; Random = new Random((int)DateTime.Now.Ticks); Timer.Tick += Timer_Tick; InitPictureBoxes(); GameStart(); ShowEmemies(); } void InitPictureBoxes() { pictureBox1.BackColor = Color.Black; pictureBox2.BackColor = Color.Black; pictureBox3.BackColor = Color.Black; pictureBox4.BackColor = Color.Black; pictureBox5.BackColor = Color.Black; pictureBox6.BackColor = Color.Black; pictureBoxLife.BackColor = Color.Black; pictureBoxTarget.BackColor = Color.Black; pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; pictureBox2.SizeMode = PictureBoxSizeMode.Zoom; pictureBox3.SizeMode = PictureBoxSizeMode.Zoom; pictureBox4.SizeMode = PictureBoxSizeMode.Zoom; pictureBox5.SizeMode = PictureBoxSizeMode.Zoom; pictureBox6.SizeMode = PictureBoxSizeMode.Zoom; pictureBoxLife.SizeMode = PictureBoxSizeMode.Zoom; pictureBoxTarget.SizeMode = PictureBoxSizeMode.Zoom; } } |
これまで数字インベーダーを文字で表示していましたが、ここではビットマップで表示します。GetBitmapFromString(string str)メソッドは文字列からビットマップを取得するためのメソッドです。
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 |
public partial class Form1 : Form { Bitmap GetBitmapFromString(string str) { if(str == "0") return BitmapNumber0; else if(str == "1") return BitmapNumber1; else if(str == "2") return BitmapNumber2; else if(str == "3") return BitmapNumber3; else if(str == "4") return BitmapNumber4; else if(str == "5") return BitmapNumber5; else if(str == "6") return BitmapNumber6; else if(str == "7") return BitmapNumber7; else if(str == "8") return BitmapNumber8; else if(str == "9") return BitmapNumber9; else if(str == "n" || str == "10") return BitmapUfo; return null; } } |
Lifeプロパティ、Targetプロパティも修正します。データを文字ではなくビットマップで示します。
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 |
public partial class Form1 : Form { int _life = 0; int Life { set { _life = value; labelLife.Text = "残 " + _life.ToString(); if(_life >= 3) pictureBoxLife.Image = BitmapLife3; if(_life == 2) pictureBoxLife.Image = BitmapLife2; if(_life == 1 || _life == 0) pictureBoxLife.Image = BitmapLife1; } get { return _life; } } int _target = 0; int Target { set { if(value > 10) value -= 11; _target = value; pictureBoxTarget.Image = GetBitmapFromString(_target.ToString()); } get { return _target; } } } |
ゲームが開始されたら isGameOverフラグを false にします。ここでLifeプロパティ、Targetプロパティがセットされ、ライフとターゲットが表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { void GameStart() { labelGameOver.Text = ""; isGameOver = false; ShotCount = 0; Target = 0; Enemies = ""; ShowEmemies(); Timer.Interval = InitTimerInterval; Timer.Start(); EnemiesCount = EnemiesMaxCount; Score = 0; Stage = 1; Life = LifeMax; isStop = false; } } |
数字インベーダーをビットマップで表示させるためにShowEmemies()メソッドを修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public partial class Form1 : Form { void ShowEmemies() { int space = EnemiesMax - Enemies.Length; string s = ""; for(int ii = 0; ii < space; ii++) { s += "-"; } s += Enemies; label2.Text = s; pictureBox1.Image = GetBitmapFromString(s.Substring(0, 1)); pictureBox2.Image = GetBitmapFromString(s.Substring(1, 1)); pictureBox3.Image = GetBitmapFromString(s.Substring(2, 1)); pictureBox4.Image = GetBitmapFromString(s.Substring(3, 1)); pictureBox5.Image = GetBitmapFromString(s.Substring(4, 1)); pictureBox6.Image = GetBitmapFromString(s.Substring(5, 1)); } } |
スコアをビットマップで表示させるためにShowScore()メソッドを修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { void ShowScore() { label1.Text = Stage.ToString() + ":"; label2.Text = String.Format("{0:000000}", Score); pictureBoxTarget.Image = GetBitmapFromString((Stage % 10).ToString()); string s = String.Format("{0:000000}", Score); pictureBox1.Image = GetBitmapFromString(s.Substring(0, 1)); pictureBox2.Image = GetBitmapFromString(s.Substring(1, 1)); pictureBox3.Image = GetBitmapFromString(s.Substring(2, 1)); pictureBox4.Image = GetBitmapFromString(s.Substring(3, 1)); pictureBox5.Image = GetBitmapFromString(s.Substring(4, 1)); pictureBox6.Image = GetBitmapFromString(s.Substring(5, 1)); } } |
ゲームオーバー時はisGameOverフラグをtrueにすると同時に、ラベルに”GAME OVER 再開 Sキー”と表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class Form1 : Form { void GameOver() { labelGameOver.Text = "GAME OVER 再開 Sキー"; isGameOver = true; isStop = true; Timer.Stop(); Life = 0; labelLife.Text = "Game Over"; ShowScore(); Timer.Interval = InitTimerInterval; } } |
ゲームオーバー時にSキーを押すとゲームが再開されます。ゲーム中に押してもisGameOverフラグの効果でなにも起きません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { private void Form1_KeyDown(object sender, KeyEventArgs e) { if(isGameOver && e.KeyData == Keys.S) GameStart(); if(isStop) return; if(e.KeyData == Keys.Z) { Target++; if(Target != 10) label1.Text = Target.ToString() + ":"; else label1.Text = "n" + ":"; } if(e.KeyData == Keys.X) { Shot(); } } } |