日期:2014-05-20 浏览次数:20948 次
class Explosion : RunObject { Size TextSize = TextRenderer.MeasureText("BOMB!", new Font("宋体", 10)); public Explosion(Point Postion, Color ForeColor, Color BackColor) : base(ForeColor, BackColor) { ObjBmp = new Bitmap(100, 20); this.X = Postion.X - TextSize.Width / 2; this.Y = Postion.Y - TextSize.Height / 2; this.SumStep = 15; } public override void Draw(ref Bitmap Bmp) { using (Graphics G = Graphics.FromImage(ObjBmp)) { G.FillRectangle(new SolidBrush(BackColor), 0, 0, TextSize.Width, TextSize.Height); // 震荡效果 G.DrawString("BOMB!", new Font("宋体", 10), new SolidBrush(ForeColor), new PointF(0 + Step % 2 * 2 - 1, Step % 2 * 2 - 1)); } base.Draw(ref Bmp); } public override void Move() { if (Step > SumStep) { Step = -1; return; } Step++; } }
List<Explosion> Explosions = new List<Explosion>();
void RunThread() { try { int Start = Environment.TickCount; Random R = new Random(); int KillCount = 0, DeathCount = 0; while (true) if (Environment.TickCount - Start > 100) { Bitmap CacheBmp = new Bitmap(OrgBmp); for (int i = 0; i < Tanks.Count; i++) { Tanks[i].Move(); Tanks[i].Draw(ref CacheBmp); if (R.Next(10) == 0) // 电脑发子弹是10分之一的可能 Bullets.Add(new Bullet(Color.Red, Tanks[i])); } UTank.Draw(ref CacheBmp); List<Bullet> TempBullets = new List<Bullet>(); for (int i = 0; i < Bullets.Count; i++) { if (Bullets[i].ObjStep != -1) { Rectangle Test = new Rectangle(Bullets[i].Postion.X - 10, Bullets[i].Postion.Y - 10, 20, 20); bool IsKilled = false; for (int j = 0; j < Tanks.Count; j++) if (Test.Contains(Tanks[j].Postion)) { if (Bullets[i].Owner == UTank) { KillCount++; IsKilled = true; // --------------------------------- // 爆炸效果增加代码 Explosions.Add(new Explosion(Tanks[j].Postion, Color.Maroon, this.BackColor)); //------------------------------------ Tanks[j] = new Tank(Color.Blue, this.BackColor); } break; } if (!IsKilled) if (Test.Contains(UTank.Postion)) if (Bullets[i].Owner != UTank) { DeathCount++; IsKilled = true; // --------------------------------- // 爆炸效果增加代码 Explosions.Add(new Explosion(UTank.Postion, Color.Gold, this.BackColor)); //------------------------------------ break; } if (!IsKilled) TempBullets.Add(Bullets[i]); } } // --------------------------------- // 爆炸效果增加代码 List<Explosion> TempExplosions = new List<Explosion>(); for (int i = 0; i < Explosions.Count; i++) { if (Explosions[i].ObjStep != -1) { Explosions[i].Move(); Explosions[i].Draw(ref CacheBmp); TempExplosions.Add(Explosions[i]); } } Explosions = new List<Explosion>(TempExplosions); //------------------------------------ Bullets = new List<Bullet>(TempBullets); for (int i = 0; i < Bullets.Count; i++) { Bullets[i].Move(); Bullets[i].Draw(ref CacheBmp); } Monitor.Enter(CacheBmp); using (Graphics G = Graphics.FromImage(CacheBmp)) { G.DrawString("杀敌数: " + KillCount.ToString() + " 死亡数: " + DeathCount.ToString(), this.Font, Brushes.Black, new PointF(0, 0)); } Monitor.Exit(CacheBmp); this.Invoke(new SetImage(DoSetImage), new Object[] { CacheBmp }); Start = Environment.TickCount; } } catch { // 忽略程序退出异常 } }