C++小游戏BrickHit实例代码

2020-01-06 18:45:42于海丽

打砖块小游戏。材料:EasyX图形库。

碰撞的处理,木板移动方法还需要优化。


//定义 Circle,Brick,Broad
#include<cmath>
#include<graphics.h>
#ifndef _PROPERTY_H_
#define _PROPERTY_H_
struct Circle {
  int x0, y0, r;
  int mvX, mvY;
  COLORREF color;
  virtual ~Circle() {}
  Circle(int x0_, int y0_, int r_, int mvX_, int mvY_, COLORREF color_)
    :x0(x0_), y0(y0_), r(r_), mvX(mvX_), mvY(mvY_), color(color_) {}
  //小球起始位置
  void prtCirl() {
    setfillcolor(color);
    solidcircle(x0, y0, r);
  }
  //小球的移动
  void CirlMove() {
    setfillcolor(BLACK);
    solidcircle(x0, y0, r);
    x0 += mvX;
    y0 += mvY;
    setfillcolor(color);
    solidcircle(x0, y0, r);
  }
  //判断小球是否离开宽口内。
  //参数:窗口左上坐标、宽、高。
  //离开返回真。
  bool IsCirlQuit(int x, int y, int width, int height) {
    if (x0 - x <= r && mvX < 0) {
      mvX = -mvX;
      return false;
    }
    else if (x + width - x0 <= r && mvX > 0) {
      mvX = -mvX;
      return false;
    }
    else if (y0 - y <= r && mvY < 0) {
      mvY = -mvY;
      return false;
    }
    else if (y + height - y0 <= r)
      return true;
    return false;
  }
};
struct Brick {
  int x0, y0;
  COLORREF color;
  int height, width;
  virtual ~Brick() {}
  Brick(int x0_, int y0_, int width_, int height_, COLORREF color_)
    :x0(x0_), y0(y0_), width(width_), height(height_), color(color_) {}
  //砖块的绘制
  void prtBrick() {
    setfillcolor(color);
    solidrectangle(x0, y0, x0 + width, y0 + height);
  }
  //判断砖块是否与小球发生碰撞
  //参数:小球
  //发生碰撞返回真
  bool IsCrashCirl(Circle &arg) {
    if (arg.x0 + arg.r < x0 || x0 + width < arg.x0 - arg.r)
      return false;
    int disY = min(abs(y0 - arg.y0), abs(y0 + height - arg.y0));
    if (disY <= arg.r) {
      arg.mvY = -arg.mvY;
      return true;
    }
    return false;
  }
  //砖块的清除
  void BrickClr() {
    setfillcolor(BLACK);
    solidrectangle(x0, y0, x0 + width, y0 + height);
  }
};
struct Broad :public Brick{
  int mvX;
  int floor, ceiling;
  virtual ~Broad() {}
  Broad(int x0_, int y0_, int width_, int height_, int mvX_,
    int floor_, int ceiling_, COLORREF color_)
    :Brick(x0_, y0_, width_, height_, color_), mvX(mvX_), floor(floor_), ceiling(ceiling_) {}
  //重载,判断木板是否与小球发生碰撞
  //参数:小球
  //发生碰撞返回真
  bool IsCrashCirl(Circle &arg) {
    if (arg.x0 + arg.r < x0 || x0 + width < arg.x0 - arg.r)
      return false;
    if (y0 - arg.y0 <= arg.r&&arg.mvY > 0) {
      arg.mvY = -arg.mvY;
      return true;
    }
    return false;
  }
  //木板移动
  void BroadMove() {
    POINT point;
    GetCursorPos(&point);
    if (x0 <= point.x&&point.x <= x0)
      return; 
    BrickClr();
    if (point.x < x0)
      x0 = max(x0 - mvX, floor);
    else
      x0 = min(x0 + mvX, ceiling - width);
    setfillcolor(color);
    solidrectangle(x0, y0, x0 + width, y0 + height);
  }
};
#endif // _PROPERTY_H_