|
分類:[C#]
C#の質問です。
下のプログラムに敵を5体倒したらプログラムが止まりクリアと表示されるゲームにしたいのですがどう付け足せばよいのでしょうか。
知恵を貸してください。
using System; using System.Collections.Generic; //for .NET 2.0 using System.Drawing; using System.Windows.Forms;
public class Shooting : Form { /// <summary> /// ゲームの状態を進行させるタイマー /// </summary> private Timer timer;
/// <summary> /// ゲーム内容を描画するバッファ /// </summary> private Bitmap buffer;
/// <summary> /// ユーザーが操作する機体オブジェクト /// </summary> private ShootingIcon userIcon;
/// <summary> /// ユーザーのミサイルの配列 /// </summary> private List<ShootingIcon> userMissiles; //for .NET 2.0
/// <summary> /// 敵の機体オブジェクトの配列 /// </summary> private List<ShootingIcon> kita; //for .NET 2.0
/// <summary> /// 敵が射出したミサイルの配列 /// </summary> private List<ShootingIcon> kitaMissiles; //for .NET 2.0
/// <summary> /// 敵がミサイルを発射するかどうかを決定する乱数 /// </summary> private Random random;
/// <summary> /// ユーザーの機体として描画されるイメージ /// </summary> private Image userImage;
/// <summary> /// ユーザーのミサイルとして描画されるイメージ /// </summary> private Image userMissileImage;
/// <summary> /// 敵の機体として描画されるイメージ /// </summary> private Image enemyImage;
/// <summary> /// 敵のミサイルとして描画されるイメージ /// </summary> private Image enemyMissileImage;
protected override void OnPaint(PaintEventArgs e) { base.OnPaint (e);
Graphics g = Graphics.FromImage(buffer); Brush brush = new SolidBrush(Color.Black); //背景色 g.FillRectangle(brush, 0, 0, buffer.Width, buffer.Height);
g.DrawImage(userIcon.Image, userIcon.X, userIcon.Y); for(int i = 0 ; i < userMissiles.Count ; i++) { ShootingIcon missile = (ShootingIcon)userMissiles[i]; g.DrawImage(missile.Image, missile.X, missile.Y); } for(int i = 0 ; i < kita.Count ; i++) { ShootingIcon enemy = (ShootingIcon)kita[i]; g.DrawImage(enemy.Image, enemy.X, enemy.Y); } for(int i = 0 ; i < kitaMissiles.Count ; i++) { ShootingIcon missile = (ShootingIcon)kitaMissiles[i]; g.DrawImage(missile.Image, missile.X, missile.Y); }
e.Graphics.DrawImage(buffer, 0, 0); }
protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown (e); if(e.KeyCode == Keys.Left ) //方向キー左で左に行く { userIcon.X -= 25; //自分の左に進む距離 } else if(e.KeyCode == Keys.Right) //方向キー右で右に行く { userIcon.X += 25; //自分の右に進む距離 } else if(e.KeyCode == Keys.Space) //スペースキーでミサイルを打つ { Fire(); }
Invalidate(); }
private void timer_Tick(object sender, EventArgs e) { //新しい敵を生成 if(kita.Count < 4) { ShootingIcon enemy = new ShootingIcon( enemyImage, random.Next(buffer.Width - enemyImage.Width), 0 ); kita.Add(enemy); }
//敵がランダムでミサイルを発射 if(random.Next(100) <0) //敵のミサイル数 { int index = random.Next(kita.Count); ShootingIcon enemy = (ShootingIcon)kita[index]; ShootingIcon missile = new ShootingIcon( enemyMissileImage, enemy.X + enemy.Width / 2 - enemy.Width / 2, enemy.Y + enemy.Height ); kitaMissiles.Add(missile); } //敵ミサイルを移動 for(int i = 0 ; i < kitaMissiles.Count ; i++) { ShootingIcon missile = (ShootingIcon)kitaMissiles[i]; missile.Y += 5; if (missile.Y >= buffer.Height) kitaMissiles.RemoveAt(i); } //ユーザーのミサイルを移動 for(int i = 0 ; i < userMissiles.Count ; i++) { ShootingIcon missile = (ShootingIcon)userMissiles[i]; missile.Y -= 5; if(missile.Y + missile.Height < 0) userMissiles.RemoveAt(i); }
//敵が画面外に消えたら削除する for(int i = 0 ; i < kita.Count ; i++) { ShootingIcon enemy = (ShootingIcon)kita[i]; enemy.Y += 4;
if(i % 2 == 0) enemy.X += 2; else enemy.X -= 2;
if(enemy.X < 0) { kita.RemoveAt(i); continue; } else if(enemy.X + enemy.Width > buffer.Width) { kita.RemoveAt(i); continue; } else if(enemy.Y > buffer.Height) { kita.RemoveAt(i); continue; } }
//敵の当たり判定 for(int i = 0 ; i < kita.Count ; i++) { ShootingIcon enemy = (ShootingIcon)kita[i]; //ユーザーが敵に接触しているかどうか if(enemy.Bounds.IntersectsWith(userIcon.Bounds)) { //敵に接触 timer.Stop();//ゲームを止める MessageBox.Show(this, "ゲームオーバーです","お疲れ様でした"); break; }
//ユーザーミサイルが敵に接触しているかどうか for(int j = 0 ; j < userMissiles.Count ; j++) { ShootingIcon missile = (ShootingIcon)userMissiles[j]; if(enemy.Bounds.IntersectsWith(missile.Bounds)) { //敵に着弾 userMissiles.RemoveAt(j);//自分のミサイルが消える kita.RemoveAt(i);//敵が消える break; }
}
}
//敵のミサイルに接触したかどうか for(int i = 0 ; i < kitaMissiles.Count ; i++) { ShootingIcon missile = (ShootingIcon)kitaMissiles[i]; if(missile.Bounds.IntersectsWith(userIcon.Bounds)) { //ミサイルに接触 timer.Stop(); //ゲームを止める MessageBox.Show(this, "ゲームオーバーです","お疲れ様でした"); break;
}
}
Invalidate(); }
/// <summary> /// ユーザーのミサイルを発射する /// </summary> /// <returns>ミサイルが発射できれば true</returns> public bool Fire() { if(userMissiles.Count >= 22) return false; //ミサイルの発射数 int x = userIcon.X + (userIcon.Width / 2) - (userMissileImage.Width / 2); int y = userIcon.Y - userMissileImage.Height; ShootingIcon missile = new ShootingIcon(userMissileImage, x, y); userMissiles.Add(missile); return true; }
public Shooting() { SetStyle( ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true );
buffer = new Bitmap(640, 550); //使える画面の大きさ random = new Random();
userMissiles = new List<ShootingIcon>(); //for .NET 2.0
kita = new List<ShootingIcon>(); //for .NET 2.0
kitaMissiles = new List<ShootingIcon>(); //for .NET 2.0
timer = new Timer(); timer.Interval = 60; //敵の速さ timer.Tick += new EventHandler(timer_Tick); timer.Start();
userImage = Image.FromFile("sen.gif");//自分 userMissileImage = Image.FromFile("kousen.gif");//自分のミサイル enemyImage = Image.FromFile("kita.gif");//敵 enemyMissileImage = Image.FromFile("kousen1.gif");//敵のミサイル userIcon = new ShootingIcon( userImage, buffer.Width / 2 - userImage.Width / 2, buffer.Height - userImage.Height ); } static void Main() { Form form = new Shooting(); form.ClientSize = new Size(640, 550); //画面の大きさ Application.Run(form); }
}
|