日期:2014-05-20 浏览次数:21109 次
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
{
// 忽略程序退出异常
}
}