c#打砖块小游戏之--对象实现层(二)

我把游戏命名为SabBoy-->破坏王,名字威武得像不像天朝的拆迁队!先看看游戏的类图: 

BaseEntity:抽象类

ISabBoy:接口类

Ball:小球类,能运动,实现"运动"接口。

Board:挡板类,能运动,实现"运动"接口。

Brick:砖块类,静止的砖块,没有"运动"行为。

 

基本的框架构建好了,下面就是实现的问题了,一步步渐进,先从基类开始:

BaseEntity.cs

[java]  view plain copy print ?
  1. public abstract class BaseEntity  
  2. {  
  3.     //坐标  
  4.     public int XPos { get; set; }  
  5.     public int YPos { get; set; }  
  6.     //速度和方向控制  
  7.     public int SpeedX { get; set; }  
  8.     public int SpeedY { get; set; }  
  9.     //对象载体  
  10.     public Rectangle Rect { get; set; }  
  11.     //画对象  
  12.     public abstract void Draw(Graphics g);  
  13. }  

接口类:ISabBoy.cs

[c-sharp]  view plain copy print ?
  1. public interface ISabBoy  
  2.   {  
  3.       void Run();  
  4.   }  

小球类:Ball.cs,

[c-sharp]  view plain copy print ?
  1. public class Ball : BaseEntity, ISabBoy  
  2. {  
  3.     /// <summary>  
  4.     /// 初始化小球位置和偏移值  
  5.     /// </summary>  
  6.     public Ball(int x, int y, int speedX, int speedY)  
  7.     {  
  8.         this.XPos = x;  
  9.         this.YPos = y;  
  10.         this.SpeedX = speedX;  
  11.         this.SpeedY = speedY;  
  12.     }  
  13.   
  14.     public override void Draw(Graphics g)  
  15.     {  
  16.         using (SolidBrush sbrush = new SolidBrush(Color.Snow))  
  17.         {  
  18.             Rect = new Rectangle(XPos, YPos, 20, 20);  
  19.             g.DrawEllipse(new Pen(Color.Gray), Rect);  
  20.             g.FillEllipse(sbrush, Rect);  
  21.         }  
  22.         g.Dispose();  
  23.     }  
  24.  
  25.  
  26.     #region ISabBoy 成员  
  27.     //临界检测碰撞,利用随机数,提高可玩性  
  28.     public void Run()  
  29.     {  
  30.         XPos = XPos + SpeedX;  
  31.         YPos = YPos - SpeedY;  
  32.         if (XPos <= 0)  
  33.             SpeedX = (new Random().Next(3, 5));  
  34.         if (XPos > 378)  
  35.             SpeedX = -(new Random().Next(3, 5));  
  36.         if (YPos <= 100)  
  37.             SpeedY = -(new Random().Next(3, 8));  
  38.     }  
  39.     #endregion  
  40. }  

挡板类:Board.cs

[c-sharp]  view plain copy print ?
  1. //挡板方向  
  2. public enum BoardDirection  
  3. {  
  4.     Left, Right  
  5. }  
  6.   
  7. public class Board:BaseEntity,ISabBoy  
  8. {  
  9.     public BoardDirection Direction { getset; }  
  10.       
  11.     public Board(int x, int y, int speed)  
  12.     {  
  13.         this.XPos = x;  
  14.         this.YPos = y;  
  15.         this.SpeedX = speed;  
  16.     }  
  17.   
  18.     public override void Draw(Graphics g)  
  19.     {  
  20.         using (SolidBrush sbrush = new SolidBrush(Color.LightBlue))  
  21.         {  
  22.             Pen p = new Pen(Color.SaddleBrown);  
  23.             Rect = new Rectangle(XPos, YPos, 70, 15);  
  24.             g.DrawRectangle(p, Rect);  
  25.             g.FillRectangle(sbrush, Rect);  
  26.         }  
  27.         g.Dispose();  
  28.     }  
  29.  
  30.     #region ISabBoy 成员  
  31.     public void Run()  
  32.     {  
  33.         switch (Direction)  
  34.         {  
  35.             case BoardDirection.Left:  
  36.                 {  
  37.                     XPos -= SpeedX;  
  38.                 }  
  39.                 break;  
  40.             case BoardDirection.Right:  
  41.                 {  
  42.                     XPos+= SpeedX;  
  43.                 }  
  44.                 break;  
  45.             default:  
  46.                 break;  
  47.         }  
  48.     }  
  49.     #endregion  
  50. }  

下面到砖块类了:Brick.cs

砖块用Rectangle类实例化,但游戏总不能只有一块砖块吧,所以我们需要构造一大块墙壁-->List<Rectangle>,至于墙壁的形状是什么就由大家按自己爱好构造了,我这里构造的是一个倒金字塔墙壁:(图示一)

                             (图示一)

[c-sharp]  view plain copy print ?
  1. public class Brick : BaseEntity  
  2. {  
  3.     private int _width = 400; //砖块集宽  
  4.     private int _height = 300;//砖块集高  
  5.     //砖块集  
  6.     public List<Rectangle> Rects { getset; }  
  7.     //构造砖墙形状  
  8.     public List<Rectangle> BrickWall()  
  9.     {  
  10.         int temp = 0;  
  11.         Rects = new List<Rectangle>();  
  12.         for (int i = 100; i < _height; i += 20)  
  13.         {  
  14.             temp += 20;  
  15.             for (int j = temp - 20; j < _width - temp; j += 30)  
  16.             {  
  17.                 Rect = new Rectangle(j, i, 28, 18);  
  18.                 Rects.Add(Rect);  
  19.             }  
  20.         }  
  21.         return Rects;  
  22.     }  
  23.     //画墙  
  24.     public override void Draw(Graphics g)  
  25.     {          
  26.         using (SolidBrush sbrush = new SolidBrush(Color.Orange))  
  27.         {  
  28.             g.Clear(Color.Black);  
  29.             Pen p = new Pen(Color.SaddleBrown, 3);  
  30.             foreach (Rectangle r in Rects)  
  31.             {  
  32.                 g.DrawRectangle(p, r);  
  33.                 g.FillRectangle(sbrush, r);  
  34.             }                 
  35.         }  
  36.         g.Dispose();  
  37.     }  
  38. }  
  

 

游戏里的对象基本构造完毕了,接下来只要处理它们之间的逻辑关系并显示到界面上即可完成!是不是迫不及待呢,下回分解!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页