我把游戏命名为SabBoy-->破坏王,名字威武得像不像天朝的拆迁队!先看看游戏的类图:
BaseEntity:抽象类
ISabBoy:接口类
Ball:小球类,能运动,实现"运动"接口。
Board:挡板类,能运动,实现"运动"接口。
Brick:砖块类,静止的砖块,没有"运动"行为。
基本的框架构建好了,下面就是实现的问题了,一步步渐进,先从基类开始:
BaseEntity.cs
- public abstract class BaseEntity
- {
- //坐标
- public int XPos { get; set; }
- public int YPos { get; set; }
- //速度和方向控制
- public int SpeedX { get; set; }
- public int SpeedY { get; set; }
- //对象载体
- public Rectangle Rect { get; set; }
- //画对象
- public abstract void Draw(Graphics g);
- }
接口类:ISabBoy.cs
- public interface ISabBoy
- {
- void Run();
- }
小球类:Ball.cs,
- public class Ball : BaseEntity, ISabBoy
- {
- /// <summary>
- /// 初始化小球位置和偏移值
- /// </summary>
- public Ball(int x, int y, int speedX, int speedY)
- {
- this.XPos = x;
- this.YPos = y;
- this.SpeedX = speedX;
- this.SpeedY = speedY;
- }
- public override void Draw(Graphics g)
- {
- using (SolidBrush sbrush = new SolidBrush(Color.Snow))
- {
- Rect = new Rectangle(XPos, YPos, 20, 20);
- g.DrawEllipse(new Pen(Color.Gray), Rect);
- g.FillEllipse(sbrush, Rect);
- }
- g.Dispose();
- }
- #region ISabBoy 成员
- //临界检测碰撞,利用随机数,提高可玩性
- public void Run()
- {
- XPos = XPos + SpeedX;
- YPos = YPos - SpeedY;
- if (XPos <= 0)
- SpeedX = (new Random().Next(3, 5));
- if (XPos > 378)
- SpeedX = -(new Random().Next(3, 5));
- if (YPos <= 100)
- SpeedY = -(new Random().Next(3, 8));
- }
- #endregion
- }
挡板类:Board.cs
- //挡板方向
- public enum BoardDirection
- {
- Left, Right
- }
- public class Board:BaseEntity,ISabBoy
- {
- public BoardDirection Direction { get; set; }
- public Board(int x, int y, int speed)
- {
- this.XPos = x;
- this.YPos = y;
- this.SpeedX = speed;
- }
- public override void Draw(Graphics g)
- {
- using (SolidBrush sbrush = new SolidBrush(Color.LightBlue))
- {
- Pen p = new Pen(Color.SaddleBrown);
- Rect = new Rectangle(XPos, YPos, 70, 15);
- g.DrawRectangle(p, Rect);
- g.FillRectangle(sbrush, Rect);
- }
- g.Dispose();
- }
- #region ISabBoy 成员
- public void Run()
- {
- switch (Direction)
- {
- case BoardDirection.Left:
- {
- XPos -= SpeedX;
- }
- break;
- case BoardDirection.Right:
- {
- XPos+= SpeedX;
- }
- break;
- default:
- break;
- }
- }
- #endregion
- }
下面到砖块类了:Brick.cs
砖块用Rectangle类实例化,但游戏总不能只有一块砖块吧,所以我们需要构造一大块墙壁-->List<Rectangle>,至于墙壁的形状是什么就由大家按自己爱好构造了,我这里构造的是一个倒金字塔墙壁:(图示一)
(图示一)
- public class Brick : BaseEntity
- {
- private int _width = 400; //砖块集宽
- private int _height = 300;//砖块集高
- //砖块集
- public List<Rectangle> Rects { get; set; }
- //构造砖墙形状
- public List<Rectangle> BrickWall()
- {
- int temp = 0;
- Rects = new List<Rectangle>();
- for (int i = 100; i < _height; i += 20)
- {
- temp += 20;
- for (int j = temp - 20; j < _width - temp; j += 30)
- {
- Rect = new Rectangle(j, i, 28, 18);
- Rects.Add(Rect);
- }
- }
- return Rects;
- }
- //画墙
- public override void Draw(Graphics g)
- {
- using (SolidBrush sbrush = new SolidBrush(Color.Orange))
- {
- g.Clear(Color.Black);
- Pen p = new Pen(Color.SaddleBrown, 3);
- foreach (Rectangle r in Rects)
- {
- g.DrawRectangle(p, r);
- g.FillRectangle(sbrush, r);
- }
- }
- g.Dispose();
- }
- }
游戏里的对象基本构造完毕了,接下来只要处理它们之间的逻辑关系并显示到界面上即可完成!是不是迫不及待呢,下回分解!