1 using System.Drawing;
2 using System.Threading;
3 using System.Windows.Forms;
4
5 /// <summary>
6 /// 窗体
7 /// </summary>
8 namespace _03_WinForm
9 {
10 public partial class Form1 : Form
11 {
12 //子线程
13 private Thread t;
14 //窗体画布
15 private static Graphics windowG;
16 //场景图片(临时画布)
17 private static Bitmap tempBmp;
18
19 public Form1()
20 {
21 InitializeComponent();
22 this.StartPosition = FormStartPosition.CenterScreen;
23 }
24
25 private void Form1_Paint(object sender, PaintEventArgs e)
26 {
27 windowG = CreateGraphics();
28 //将场景绘制到临时画布上,再将临时画布绘制到窗体画布上,解决画面闪烁
29 tempBmp = new Bitmap(450, 450);
30 Graphics bmpG = Graphics.FromImage(tempBmp);
31 GameFramework.graphics = bmpG;
32 //创建子线程
33 t = new Thread(delegate () { GameMainThread(); }, 1073741824);//防止递归调用的方法会内存溢出
34 t.Start();
35 }
36
37 //子线程
38 public static void GameMainThread()
39 {
40 //GameFramework
41 GameFramework.Start();
42 //更新时间
43 int sleepTime = 1000 / 60;
44 //每秒调用60次
45 while (true)
46 {
47 //清空画布
48 GameFramework.graphics.Clear(Color.Black);
49 //重新刷新
50 GameFramework.Update();
51 //重新绘制
52 windowG.DrawImage(tempBmp, 0, 0);
53 //间隔
54 Thread.Sleep(sleepTime);
55 }
56 }
57
58 //窗口关闭后终止线程
59 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
60 {
61 t.Abort();
62 }
63
64 //点击按键
65 private void Form1_KeyDown(object sender, KeyEventArgs e)
66 {
67 GameObjectManager.KeyDown(e);
68 }
69
70 //抬起按键
71 private void Form1_KeyUp(object sender, KeyEventArgs e)
72 {
73 GameObjectManager.KeyUp(e);
74 }
75 }
76 }
1 using _03_WinForm.Properties;
2 using System.Drawing;
3
4 /// <summary>
5 /// 游戏框架
6 /// </summary>
7 namespace _03_WinForm
8 {
9 enum GameState
10 {
11 Running,
12 GameOver
13 }
14
15 class GameFramework
16 {
17 private static GameState gameState = GameState.Running;
18 public static Graphics graphics;
19 public static void Start()
20 {
21 //声音初始化
22 SoundManager.SoundInit();
23 //播放背景音乐
24 SoundManager.PlayStart();
25 //初始化敌人位置
26 GameObjectManager.Start();
27 //初始化创建地图
28 GameObjectManager.CreateMap();
29 //创建玩家坦克
30 GameObjectManager.CreateMyTank();
31 }
32
33 public static void Update()
34 {
35 //实时刷新场景元素
36 if (gameState == GameState.Running)
37 {
38 GameObjectManager.Update();
39 }
40 else
41 {//游戏结束界面
42 graphics.DrawImage(Resources.GameOver, new Point(450 / 2 - Resources.GameOver.Width / 2, 450 / 2 - Resources.GameOver.Height / 2));
43 }
44 }
45
46 public static void GameOver()
47 {
48 gameState = GameState.GameOver;
49 }
50 }
51 }
1 using _03_WinForm.Properties;
2 using System.Media;
3
4 /// <summary>
5 /// 声音管理
6 /// </summary>
7 namespace _03_WinForm
8 {
9 class SoundManager
10 {
11 private static SoundPlayer start = new SoundPlayer();
12 private static SoundPlayer add = new SoundPlayer();
13 private static SoundPlayer hit = new SoundPlayer();
14 private static SoundPlayer blast = new SoundPlayer();
15 private static SoundPlayer fire = new SoundPlayer();
16
17 public static void SoundInit()
18 {
19 start.Stream = Resources.start;
20 add.Stream = Resources.add;
21 hit.Stream = Resources.hit;
22 blast.Stream = Resources.blast;
23 fire.Stream = Resources.fire;
24 }
25
26 //播放背景音乐
27 public static void PlayStart()
28 {
29 start.PlayLooping();
30 }
31
32 //添加玩家和敌人
33 public static void Add()
34 {
35 add.Play();
36 }
37
38 //玩家受伤
39 public static void Hit()
40 {
41 hit.Play();
42 }
43
44 //爆炸
45 public static void Blast()
46 {
47 blast.Play();
48 }
49
50 //射击
51 public static void Fire()
52 {
53 fire.Play();
54 }
55 }
56 }
1 using _03_WinForm.Properties;
2 using System;
3 using System.Collections.Generic;
4 using System.Drawing;
5 using System.Windows.Forms;
6
7 /// <summary>
8 /// 场景管理
9 /// </summary>
10 namespace _03_WinForm
11 {
12 class GameObjectManager
13 {
14 //场景元素集合
15 private static List<GameObject> objList = new List<GameObject>();
16 //墙集合
17 private static List<NotMovething> wallList = new List<NotMovething>();
18 //钢铁墙集合
19 private static List<NotMovething> steelList = new List<NotMovething>();
20 //boss
21 private static NotMovething boss;
22 //玩家
23 private static MyTank myTank;
24 //敌人生成速度
25 private static int EnemyBornSpeed = 60;
26 //计数器
27 private static int EnemyBornCount = 60;
28 //敌人位置数组
29 private static Point[] points = new Point[3];
30 //敌人集合
31 private static List<EnemyTank> enemyList = new List<EnemyTank>();
32 //子弹集合
33 private static List<Bullet> bulletList = new List<Bullet>();
34 //特效集合
35 private static List<Explosion> explosionList = new List<Explosion>();
36
37 public static void Start()
38 {
39 points[0].X = 0;
40 points[0].Y = 0;
41 points[1].X = 7 * 30;
42 points[1].Y = 0;
43 points[2].X = 14 * 30;
44 points[2].Y = 0;
45 }
46
47 public static void Update()
48 {
49 foreach (GameObject item in objList)
50 {
51 item.Update();
52 }
53 foreach (GameObject item in bulletList)
54 {
55 item.Update();
56 }
57 foreach (GameObject item in explosionList)
58 {
59 item.Update();
60 }
61 EnemyBorn();
62 CheckDestroyBullet();
63 CheckDestroyExp();
64 }
65
66 //检测是否销毁子弹
67 private static void CheckDestroyBullet()
68 {
69 List<Bullet> bullets = new List<Bullet>();
70 foreach (Bullet item in bulletList)
71 {
72 if (item.bDestroy)
73 bullets.Add(item);
74 }
75 foreach (Bullet item in bullets)
76 {
77 bulletList.Remove(item);
78 }
79 }
80
81 //检测是否销毁特效
82 public static void CheckDestroyExp()
83 {
84 List<Explosion> explosions = new List<Explosion>();
85 foreach (Explosion item in explosionList)
86 {
87 if (item.bDestroy)
88 explosions.Add(item);
89 }
90 foreach (Explosion item in explosions)
91 {
92 explosionList.Remove(item);
93 }
94 }
95
96 //销毁墙
97 public static void DestroyWall(NotMovething wall)
98 {
99 objList.Remove(wall);
100 wallList.Remove(wall);
101 }
102
103 //销毁敌人
104 public static void DestroyEnemy(EnemyTank enemy)
105 {
106 objList.Remove(enemy);
107 enemyList.Remove(enemy);
108 }
109
110 //销毁玩家
111 public static void DestroyPlayer()
112 {
113 objList.Remove(myTank);
114 }
115
116 //销毁boss
117 public static void DestroyBoss()
118 {
119 objList.Remove(boss);
120 }
121
122 //创建地图
123 public static void CreateMap()
124 {
125 CreateWall(1, 1, 4, Resources.wall);
126 CreateWall(3, 1, 4, Resources.wall);
127 CreateWall(5, 1, 4, Resources.wall);
128 CreateWall(7, 1, 4, Resources.wall);
129 CreateSteel(7, 7, 1, Resources.steel);
130 CreateWall(9, 1, 4, Resources.wall);
131 CreateWall(11, 1, 4, Resources.wall);
132 CreateWall(13, 1, 4, Resources.wall);
133
134 CreateSteel(2, 7, 1, Resources.steel);
135 CreateWall(3, 7, 1, Resources.wall);
136 CreateWall(6, 7, 1, Resources.wall);
137 CreateWall(8, 7, 1, Resources.wall);
138 CreateWall(11, 7, 1, Resources.wall);
139 CreateSteel(12, 7, 1, Resources.steel);
140
141 CreateWall(1, 10, 4, Resources.wall);
142 CreateWall(3, 10, 4, Resources.wall);
143 CreateWall(5, 10, 2, Resources.wall);
144 CreateWall(6, 10, 1, Resources.wall);
145 CreateWall(7, 10, 1, Resources.wall);
146 CreateWall(8, 10, 1, Resources.wall);
147 CreateWall(9, 10, 2, Resources.wall);
148 CreateWall(11, 10, 4, Resources.wall);
149 CreateWall(13, 10, 4, Resources.wall);
150
151 CreateWall(6, 13, 2, Resources.wall);
152 CreateWall(7, 13, 1, Resources.wall);
153 CreateBoss(7, 14, Resources.Boss);
154 CreateWall(8, 13, 2, Resources.wall);
155 }
156
157 //创建墙
158 public static void CreateWall(int x, int y, int count, Image img)
159 {
160 int xPosition = x * 30;
161 int yPosition = y * 30;
162 for (int i = yPosition; i < yPosition + count * 30; i += 15)
163 {
164 NotMovething item1 = new NotMovething(xPosition, i, img);
165 NotMovething item2 = new NotMovething(xPosition + 15, i, img);
166 objList.Add(item1);
167 objList.Add(item2);
168 wallList.Add(item1);
169 wallList.Add(item2);
170 }
171 }
172
173 //创建钢铁墙
174 public static void CreateSteel(int x, int y, int count, Image img)
175 {
176 int xPosition = x * 30;
177 int yPosition = y * 30;
178 for (int i = yPosition; i < yPosition + count * 30; i += 15)
179 {
180 NotMovething item1 = new NotMovething(xPosition, i, img);
181 NotMovething item2 = new NotMovething(xPosition + 15, i, img);
182 objList.Add(item1);
183 objList.Add(item2);
184 steelList.Add(item1);
185 steelList.Add(item2);
186 }
187 }
188
189 //创建Boss
190 public static void CreateBoss(int x, int y, Image img)
191 {
192 int xPosition = x * 30;
193 int yPosition = y * 30;
194 boss = new NotMovething(xPosition, yPosition, img);
195 objList.Add(boss);
196 }
197
198
199 //创建玩家坦克
200 public static void CreateMyTank()
201 {
202 int xPosition = 5 * 30;
203 int yPosition = 14 * 30;
204 myTank = new MyTank(xPosition, yPosition, 5);
205 objList.Add(myTank);
206 }
207
208 //创建子弹
209 public static void CreateBullet(int x, int y, Direction dir, Tag tag)
210 {
211 SoundManager.Fire();
212 Bullet bullet = new Bullet(x, y, 10, dir, tag);
213 bulletList.Add(bullet);
214 }
215
216 //创建爆炸特效
217 public static void CreateExplosion(int x, int y)
218 {
219 Explosion explosion = new Explosion(x, y);
220 explosionList.Add(explosion);
221 }
222
223 #region 创建敌人
224 private static void EnemyBorn()
225 {
226 EnemyBornCount++;
227 if (EnemyBornCount < EnemyBornSpeed) return;
228 Random rd = new Random();
229 int index = rd.Next(0, 3);
230 Point point = points[index];
231 Random rd1 = new Random();
232 int enemyType = rd1.Next(1, 5);
233 switch (enemyType)
234 {
235 case 1:
236 CreateEnemyTank1(point.X,point.Y);
237 break;
238 case 2:
239 CreateEnemyTank2(point.X, point.Y);
240 break;
241 case 3:
242 CreateEnemyTank3(point.X, point.Y);
243 break;
244 case 4:
245 CreateEnemyTank4(point.X, point.Y);
246 break;
247 }
248 EnemyBornCount = 0;
249 }
250
251 private static void CreateEnemyTank1(int x, int y)
252 {
253 EnemyTank enemy = new EnemyTank(x,y,5,Resources.YellowUp,Resources.YellowDown, Resources.YellowLeft, Resources.YellowRight);
254 objList.Add(enemy);
255 enemyList.Add(enemy);
256 }
257
258 private static void CreateEnemyTank2(int x, int y)
259 {
260 EnemyTank enemy = new EnemyTank(x, y, 4, Resources.GrayUp, Resources.GrayDown, Resources.GrayLeft, Resources.GrayRight);
261 objList.Add(enemy);
262 enemyList.Add(enemy);
263 }
264
265 private static void CreateEnemyTank3(int x, int y)
266 {
267 EnemyTank enemy = new EnemyTank(x, y, 3, Resources.GreenUp, Resources.GreenDown, Resources.GreenLeft, Resources.GreenRight);
268 objList.Add(enemy);
269 enemyList.Add(enemy);
270 }
271
272 private static void CreateEnemyTank4(int x, int y)
273 {
274 EnemyTank enemy = new EnemyTank(x, y, 2, Resources.QuickUp, Resources.QuickDown, Resources.QuickLeft, Resources.QuickRight);
275 objList.Add(enemy);
276 enemyList.Add(enemy);
277 }
278 #endregion
279
280 #region 碰撞检测
281 //是否跟红墙发生碰撞
282 public static NotMovething IsCollidedWall(Rectangle rt)
283 {
284 foreach (NotMovething wall in wallList)
285 {
286 if (wall.GetRectangle().IntersectsWith(rt))
287 {
288 return wall;
289 }
290 }
291 return null;
292 }
293
294 //是否跟钢铁墙发生碰撞
295 public static NotMovething IsCollidedSteel(Rectangle rt)
296 {
297 foreach (NotMovething steel in steelList)
298 {
299 if (steel.GetRectangle().IntersectsWith(rt))
300 {
301 return steel;
302 }
303 }
304 return null;
305 }
306
307 //是否跟玩家发生碰撞
308 public static Movething IsCollidedPlayer(Rectangle rt)
309 {
310 if (myTank.GetRectangle().IntersectsWith(rt))
311 {
312 return myTank;
313 }
314 return null;
315 }
316
317 //是否跟敌人发生碰撞
318 public static Movething IsCollidedEnemy(Rectangle rt)
319 {
320 foreach (Movething enemy in enemyList)
321 {
322 if (enemy.GetRectangle().IntersectsWith(rt))
323 {
324 return enemy;
325 }
326 }
327 return null;
328 }
329
330 //是否跟子弹发生碰撞
331 public static Bullet IsCollidedBullet(Rectangle rt)
332 {
333 foreach (Bullet bullet in bulletList)
334 {
335 if (bullet.GetRectangle().IntersectsWith(rt))
336 {
337 return bullet;
338 }
339 }
340 return null;
341 }
342
343 //是否跟Boss发生碰撞
344 public static NotMovething IsCollidedBoss(Rectangle rt)
345 {
346 if (boss.GetRectangle().IntersectsWith(rt))
347 {
348 return boss;
349 }
350 return null;
351 }
352 #endregion
353
354 //点击触发
355 public static void KeyDown(KeyEventArgs e)
356 {
357 myTank.KeyDown(e);
358 }
359
360 //抬起触发
361 public static void KeyUp(KeyEventArgs e)
362 {
363 myTank.KeyUp(e);
364 }
365 }
366 }
1 using System.Drawing;
2
3 /// <summary>
4 /// 场景物体基类
5 /// </summary>
6 namespace _03_WinForm
7 {
8 abstract class GameObject
9 {
10 public int X { get; set; }
11 public int Y { get; set; }
12
13 public int width { get; set; }
14 public int height { get; set; }
15
16 protected abstract Image GetImage();
17
18 public virtual void DrawSelf()
19 {
20 Graphics graphics = GameFramework.graphics;
21 graphics.DrawImage(GetImage(), X, Y);
22 }
23
24 public virtual void Update()
25 {
26 DrawSelf();
27 }
28
29 public Rectangle GetRectangle()
30 {
31 Rectangle rectangle = new Rectangle(X, Y, width, height);
32 return rectangle;
33 }
34 }
35 }
1 using System.Drawing;
2
3 /// <summary>
4 /// 可移动物体
5 /// </summary>
6 namespace _03_WinForm
7 {
8 enum Direction
9 {
10 Up = 0,
11 Down = 1,
12 Left = 2,
13 Right = 3
14 }
15
16 class Movething : GameObject
17 {
18 private object _lock = new object();
19 public Bitmap BitmapUp { get; set; }
20 public Bitmap BitmapDown { get; set; }
21 public Bitmap BitmapLeft { get; set; }
22 public Bitmap BitmapRight { get; set; }
23
24 public int Speed { get; set; }
25 private Direction dir { get; set; }
26 public Direction Dir {
27 get
28 {
29 return dir;
30 }
31 set
32 {
33 dir = value;
34 Bitmap bmp = null;
35 switch (dir)
36 {
37 case Direction.Up:
38 bmp = BitmapUp;
39 break;
40 case Direction.Down:
41 bmp = BitmapDown;
42 break;
43 case Direction.Left:
44 bmp = BitmapLeft;
45 break;
46 case Direction.Right:
47 bmp = BitmapRight;
48 break;
49 }
50 lock (_lock)
51 {//加锁解决资源冲突
52 width = bmp.Width;
53 height = bmp.Height;
54 }
55 }
56 }
57
58 public override void DrawSelf()
59 {
60 lock (_lock)
61 {//加锁解决资源冲突
62 base.DrawSelf();
63 }
64 }
65
66 protected override Image GetImage()
67 {
68 Bitmap bitmap = null;
69 switch (Dir)
70 {
71 case Direction.Up:
72 bitmap = BitmapUp;
73 break;
74 case Direction.Down:
75 bitmap = BitmapDown;
76 break;
77 case Direction.Left:
78 bitmap = BitmapLeft;
79 break;
80 case Direction.Right:
81 bitmap = BitmapRight;
82 break;
83 default:
84 bitmap = BitmapUp;
85 break;
86 }
87 bitmap.MakeTransparent(Color.Black);
88 return bitmap;
89 }
90 }
91 }
1 using System.Drawing;
2
3 /// <summary>
4 /// 不可移动物体
5 /// </summary>
6 namespace _03_WinForm
7 {
8 class NotMovething : GameObject
9 {
10 private Image img { get; set; }
11 public Image Img
12 {
13 get
14 {
15 return img;
16 }
17 set
18 {
19 img = value;
20 width = img.Width;
21 height = img.Height;
22 }
23 }
24
25 protected override Image GetImage()
26 {
27 return Img;
28 }
29
30 public NotMovething(int x, int y, Image img)
31 {
32 this.X = x;
33 this.Y = y;
34 this.Img = img;
35 }
36 }
37 }
1 using _03_WinForm.Properties;
2 using System.Drawing;
3 using System.Windows.Forms;
4
5 /// <summary>
6 /// 玩家类
7 /// </summary>
8 namespace _03_WinForm
9 {
10 class MyTank:Movething
11 {
12 private bool bMove { get; set; }
13 public int Hp { get; set; }
14 public MyTank(int x, int y, int speed)
15 {
16 this.bMove = false;
17 this.Hp = 1;
18 this.X = x;
19 this.Y = y;
20 this.Speed = speed;
21 BitmapUp = Resources.MyTankUp;
22 BitmapDown = Resources.MyTankDown;
23 BitmapLeft = Resources.MyTankLeft;
24 BitmapRight = Resources.MyTankRight;
25 this.Dir = Direction.Up;
26 }
27
28 public override void Update()
29 {
30 base.Update();
31 Check();
32 Move();
33 }
34
35 //检测是否可移动
36 private void Check()
37 {
38 #region 碰撞检测
39 Rectangle rect = GetRectangle();
40 switch (Dir)
41 {
42 case Direction.Up:
43 rect.Y -= Speed;
44 break;
45 case Direction.Down:
46 rect.Y += Speed;
47 break;
48 case Direction.Left:
49 rect.X -= Speed;
50 break;
51 case Direction.Right:
52 rect.X += Speed;
53 break;
54 }
55 if (GameObjectManager.IsCollidedWall(rect) != null)
56 {
57 this.bMove = false; return;
58 }
59 if (GameObjectManager.IsCollidedSteel(rect) != null)
60 {
61 this.bMove = false; return;
62 }
63 if (GameObjectManager.IsCollidedBoss(rect) != null)
64 {
65 this.bMove = false; return;
66 }
67 if (GameObjectManager.IsCollidedEnemy(rect) != null)
68 {
69 this.bMove = false; return;
70 }
71 #endregion
72
73 #region 检测是否超出窗体边界
74 if (this.Dir == Direction.Left)
75 {
76 if (this.X - Speed < 0)
77 this.bMove = false; return;
78 }
79 else if (this.Dir == Direction.Right)
80 {
81 if (this.X + Speed + width > 450)
82 this.bMove = false; return;
83 }
84 else if (this.Dir == Direction.Up)
85 {
86 if (this.Y - Speed < 0)
87 this.bMove = false; return;
88 }
89 else if (this.Dir == Direction.Down)
90 {
91 if (this.Y + Speed + height > 450)
92 this.bMove = false; return;
93 }
94 #endregion
95 }
96
97 //移动
98 private void Move()
99 {
100 if (bMove)
101 {
102 if (this.Dir == Direction.Left)
103 {
104 this.X -= Speed;
105 }
106 if (this.Dir == Direction.Right)
107 {
108 this.X += Speed;
109 }
110 if (this.Dir == Direction.Up)
111 {
112 this.Y -= Speed;
113 }
114 if (this.Dir == Direction.Down)
115 {
116 this.Y += Speed;
117 }
118 }
119 }
120
121 //点击触发
122 public void KeyDown(KeyEventArgs e)
123 {
124 if (e.KeyCode == Keys.A)
125 {
126 bMove = true;
127 this.Dir = Direction.Left;
128 }
129 if (e.KeyCode == Keys.D)
130 {
131 bMove = true;
132 this.Dir = Direction.Right;
133 }
134 if (e.KeyCode == Keys.W)
135 {
136 bMove = true;
137 this.Dir = Direction.Up;
138 }
139 if (e.KeyCode == Keys.S)
140 {
141 bMove = true;
142 this.Dir = Direction.Down;
143 }
144 if (e.KeyCode == Keys.Space)
145 {//发射子弹
146 int x = this.X;
147 int y = this.Y;
148 switch (this.Dir)
149 {
150 case Direction.Up:
151 x += width / 2;
152 break;
153 case Direction.Down:
154 x += width / 2;
155 y += height;
156 break;
157 case Direction.Left:
158 y += height / 2;
159 break;
160 case Direction.Right:
161 x += width;
162 y += height / 2;
163 break;
164 default:
165 break;
166 }
167 GameObjectManager.CreateBullet(x, y, this.Dir, Tag.MyTank);
168 }
169 }
170
171 //抬起触发
172 public void KeyUp(KeyEventArgs e)
173 {
174 bMove = false;
175 }
176 }
177 }
1 using System;
2 using System.Drawing;
3
4 /// <summary>
5 /// 敌人类
6 /// </summary>
7 namespace _03_WinForm
8 {
9 class EnemyTank:Movething
10 {
11 private Random rd = new Random();
12
13 //攻击间隔
14 public int attackSpeed { get; set; }
15 private int attackCount = 0;
16
17 //随机转向间隔
18 public int turnSpeed { get; set; }
19 private int turnCount = 0;
20
21 public EnemyTank(int x, int y, int speed, Bitmap bitmapUp, Bitmap bitmapDown, Bitmap bitmapLeft, Bitmap bitmapRight)
22 {
23 this.X = x;
24 this.Y = y;
25 this.Speed = speed;
26 BitmapUp = bitmapUp;
27 BitmapDown = bitmapDown;
28 BitmapLeft = bitmapLeft;
29 BitmapRight = bitmapRight;
30 this.Dir = Direction.Down;
31 attackSpeed = 60;
32 turnSpeed = 60;
33 SoundManager.Add();
34 }
35
36 public override void Update()
37 {
38 base.Update();
39 Check();
40 Move();
41 AttackCheck();
42 TurnCheck();
43 }
44
45 //检测是否攻击
46 private void AttackCheck()
47 {
48 attackCount++;
49 if (attackCount >= attackSpeed)
50 {
51 Attack();
52 attackCount = 0;
53 }
54 }
55
56 //检测是否随机转向
57 private void TurnCheck()
58 {
59 turnCount++;
60 if (turnCount >= turnSpeed)
61 {
62 ChangeDirection();
63 turnCount = 0;
64 }
65 }
66
67 //检测是否可移动
68 private void Check()
69 {
70 #region 碰撞检测
71 Rectangle rect = GetRectangle();
72 switch (Dir)
73 {
74 case Direction.Up:
75 rect.Y -= Speed;
76 break;
77 case Direction.Down:
78 rect.Y += Speed;
79 break;
80 case Direction.Left:
81 rect.X -= Speed;
82 break;
83 case Direction.Right:
84 rect.X += Speed;
85 break;
86 }
87 if (GameObjectManager.IsCollidedWall(rect) != null)
88 {
89 ChangeDirection(); return;
90 }
91 if (GameObjectManager.IsCollidedSteel(rect) != null)
92 {
93 ChangeDirection(); return;
94 }
95 if (GameObjectManager.IsCollidedBoss(rect) != null)
96 {
97 ChangeDirection(); return;
98 }
99 if (GameObjectManager.IsCollidedPlayer(rect) != null)
100 {
101 ChangeDirection(); return;
102 }
103 #endregion
104
105 #region 检测是否超出窗体边界
106 if (this.Dir == Direction.Left)
107 {
108 if (this.X - Speed < 0)
109 {
110 ChangeDirection();return;
111 }
112 }
113 else if (this.Dir == Direction.Right)
114 {
115 if (this.X + Speed + width > 450)
116 {
117 ChangeDirection(); return;
118 }
119 }
120 else if (this.Dir == Direction.Up)
121 {
122 if (this.Y - Speed < 0)
123 {
124 ChangeDirection(); return;
125 }
126 }
127 else if (this.Dir == Direction.Down)
128 {
129 if (this.Y + Speed + height > 450)
130 {
131 ChangeDirection(); return;
132 }
133 }
134 #endregion
135 }
136
137 //改变朝向
138 private void ChangeDirection()
139 {
140 while (true)
141 {
142 Direction dir = (Direction)rd.Next(0, 4);
143 if (dir == Dir)
144 {
145 continue;
146 }
147 else
148 {
149 Dir = dir;
150 break;
151 }
152 }
153 Check();
154 }
155
156 //移动
157 private void Move()
158 {
159 if (this.Dir == Direction.Left)
160 {
161 this.X -= Speed;
162 }
163 if (this.Dir == Direction.Right)
164 {
165 this.X += Speed;
166 }
167 if (this.Dir == Direction.Up)
168 {
169 this.Y -= Speed;
170 }
171 if (this.Dir == Direction.Down)
172 {
173 this.Y += Speed;
174 }
175 }
176
177 //攻击
178 private void Attack()
179 {
180 int x = this.X;
181 int y = this.Y;
182 switch (this.Dir)
183 {
184 case Direction.Up:
185 x += width / 2;
186 break;
187 case Direction.Down:
188 x += width / 2;
189 y += height;
190 break;
191 case Direction.Left:
192 y += height / 2;
193 break;
194 case Direction.Right:
195 x += width;
196 y += height / 2;
197 break;
198 default:
199 break;
200 }
201 GameObjectManager.CreateBullet(x, y, this.Dir, Tag.EnemyTank);
202 }
203 }
204 }
1 using _03_WinForm.Properties;
2 using System.Drawing;
3
4 /// <summary>
5 /// 子弹类
6 /// </summary>
7 namespace _03_WinForm
8 {
9 enum Tag
10 {
11 MyTank,
12 EnemyTank
13 }
14
15 class Bullet : Movething
16 {
17 public Tag tag { get; set; }
18 public bool bDestroy { get; set; }
19
20 public Bullet(int x, int y, int speed, Direction dir,Tag tag)
21 {
22 this.X = x;
23 this.Y = y;
24 this.Speed = speed;
25 BitmapUp = Resources.BulletUp;
26 BitmapDown = Resources.BulletDown;
27 BitmapLeft = Resources.BulletLeft;
28 BitmapRight = Resources.BulletRight;
29 this.Dir = dir;
30 this.tag = tag;
31 //位置修正,减去图片大小一半
32 this.X -= width / 2;
33 this.Y -= height / 2;
34 bDestroy = false;
35 }
36
37 public override void Update()
38 {
39 base.Update();
40 Check();
41 Move();
42 }
43
44 //检测
45 private void Check()
46 {
47 #region 碰撞检测
48 Rectangle rect = GetRectangle();
49 rect.X += width / 2 - 3;
50 rect.Y += height / 2 - 3;
51 rect.Width = 3;
52 rect.Height = 3;
53 switch (Dir)
54 {
55 case Direction.Up:
56 rect.Y -= Speed;
57 break;
58 case Direction.Down:
59 rect.Y += Speed;
60 break;
61 case Direction.Left:
62 rect.X -= Speed;
63 break;
64 case Direction.Right:
65 rect.X += Speed;
66 break;
67 }
68 NotMovething wall = null;
69 Movething enemy = null;
70 Bullet bullet = null;
71 Movething myTank = null;
72 int _expX = this.X + width / 2;
73 int _expY = this.Y + height / 2;
74 if ((wall = GameObjectManager.IsCollidedWall(rect)) != null)
75 {
76 //音效
77 SoundManager.Blast();
78 //爆炸特效
79 GameObjectManager.CreateExplosion(_expX, _expY);
80 //移除红墙
81 GameObjectManager.DestroyWall(wall);
82 bDestroy = true; return;
83 }
84 if (GameObjectManager.IsCollidedSteel(rect) != null)
85 {
86 //音效
87 SoundManager.Blast();
88 //爆炸特效
89 GameObjectManager.CreateExplosion(_expX, _expY);
90 bDestroy = true; return;
91 }
92 if (GameObjectManager.IsCollidedBoss(rect) != null)
93 {
94 //音效
95 SoundManager.Blast();
96 //爆炸特效
97 GameObjectManager.CreateExplosion(_expX, _expY);
98 //移除boss
99 GameObjectManager.DestroyBoss();
100 //游戏结束
101 GameFramework.GameOver();
102 bDestroy = true; return;
103 }
104 if ((enemy = GameObjectManager.IsCollidedEnemy(rect)) != null)
105 {
106 //音效
107 SoundManager.Blast();
108 //移除敌人
109 GameObjectManager.CreateExplosion(_expX, _expY);
110 //爆炸特效
111 GameObjectManager.DestroyEnemy((EnemyTank)enemy);
112 bDestroy = true; return;
113 }
114 if ((myTank = GameObjectManager.IsCollidedPlayer(rect)) != null)
115 {
116 if (this.tag == Tag.EnemyTank)
117 {
118 //爆炸特效
119 GameObjectManager.CreateExplosion(_expX, _expY);
120 //音效
121 SoundManager.Hit();
122 //扣血
123 MyTank my = (MyTank)myTank;
124 my.Hp--;
125 if (my.Hp <= 0)
126 {
127 //移除玩家
128 GameObjectManager.DestroyPlayer();
129 //重生
130 GameObjectManager.CreateMyTank();
131 }
132 bDestroy = true; return;
133 }
134 }
135 if ((bullet = GameObjectManager.IsCollidedBullet(rect)) != null && GameObjectManager.IsCollidedBullet(rect) != this)
136 {
137 //音效
138 SoundManager.Blast();
139 //爆炸特效
140 GameObjectManager.CreateExplosion(_expX, _expY);
141 //子弹相互抵消
142 bDestroy = true; bullet.bDestroy = true; return;
143 }
144 #endregion
145
146 #region 检测是否超出窗体边界
147 if (this.Dir == Direction.Left)
148 {
149 if (this.X + width / 2 - 3 < 0)
150 bDestroy = true; return;
151 }
152 else if (this.Dir == Direction.Right)
153 {
154 if (this.X + width / 2 + 3 < 0)
155 bDestroy = true; return;
156 }
157 else if (this.Dir == Direction.Up)
158 {
159 if (this.Y + height / 2 + 3 < 0)
160 bDestroy = true; return;
161 }
162 else if (this.Dir == Direction.Down)
163 {
164 if (this.Y + height / 2 - 3 < 0)
165 bDestroy = true; return;
166 }
167 #endregion
168 }
169
170 //移动
171 private void Move()
172 {
173 if (this.Dir == Direction.Left)
174 {
175 this.X -= Speed;
176 }
177 if (this.Dir == Direction.Right)
178 {
179 this.X += Speed;
180 }
181 if (this.Dir == Direction.Up)
182 {
183 this.Y -= Speed;
184 }
185 if (this.Dir == Direction.Down)
186 {
187 this.Y += Speed;
188 }
189 }
190 }
191 }
1 using _03_WinForm.Properties;
2 using System.Drawing;
3
4 /// <summary>
5 /// 爆炸特效
6 /// </summary>
7 namespace _03_WinForm
8 {
9 class Explosion : GameObject
10 {
11 public bool bDestroy { get; set; }
12 private int playSpeed = 1;
13 private int playCount = 0;
14 private int index = 0;
15
16 public Bitmap[] bmpArray = new Bitmap[]
17 {
18 Resources.EXP1,
19 Resources.EXP2,
20 Resources.EXP3,
21 Resources.EXP4,
22 Resources.EXP5,
23 };
24 public Explosion(int x,int y)
25 {
26 foreach (Bitmap item in bmpArray)
27 {
28 item.MakeTransparent(Color.Black);
29 }
30 this.X = x - bmpArray[0].Width / 2;
31 this.Y = y - bmpArray[0].Height / 2;
32 bDestroy = false;
33 }
34
35 protected override Image GetImage()
36 {
37 return bmpArray[index];
38 }
39
40 public override void Update()
41 {
42 playCount++;
43 if (playCount > bmpArray.Length)
44 {
45 bDestroy = true; return;
46 }
47 index = (playCount - 1) / playSpeed;
48 base.Update();
49 }
50 }
51 }