ZERO_BEYOND

博客园 首页 联系 订阅 管理
 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 }
 
posted on 2023-04-29 14:53  ZERO_BEYOND  阅读(293)  评论(1编辑  收藏  举报