大家好,我终于更新啦。昨天是国庆节最后一天,我也回到了学校,决定趁势把这篇文章更新完,结果也是花了一天多的时间才完成呢。
回顾上篇,我们已经完成了砖块类和木板类的定义,现在只缺少一个活蹦乱跳的小球,这个小游戏就算完成了。话不多说,我们现在马上开始。
对于一个小球的话,让我们先想想我们需要定义些什么,处理些什么。
首先是小球的尺寸和位置,这个容易,用r表示小球半径,ballx,bally代表小球坐标,用addx,addy描述小球在xOy坐标系上的运动方向。另外在初始化小球坐标时,可以将小球摆在木板的上表面的中心位置处;
其次要处理的问题,也是最核心的两个问题是,小球与砖块的碰撞、小球与木板的碰撞,具体计算的我们稍后讨论。
以上便是我们定义小球类的思路。首先我们给出小球类的部分。
class Ball
{
public:
const int r = 8; //定义球的半径
const int speed = 1; //定义球的飞行速度
int ballx, bally; //定义球的坐标
int addx, addy; //表示球的飞行方向
//设置两个个标志量
bool go; //小球是否发射
bool iscatch; //木板是否捕捉到了小球
//构造函数 使小球初始时位于木板中心上 参数是木板的宽
Ball(int board_wide)
{
ballx = WINDOW_WIDE / 2;
bally = WINDOW_HEIGHT - board_wide - r - 1;
//初始时小球向右上方发射
addx = 1;
addy = -1;
go = 0; //初始化状态 小球未发射出去
iscatch = 1; //初始化状态 球被木板接住
};
}
类中定义的两个标志量,将会在接下来的成员函数中用到。
下面我用一张图解释小球与砖块的碰撞关系,理解了这以后,小球和木板的碰撞同理。
除此之外,还有小球碰到边界后反弹,这个倒也容易。
另外关于小球与木板或是砖块间的碰撞,大家可以多画图,多试验。下面的代码我自己确实摸索了很久,能有现在这个效果我也还是挺开心了。
具体代码如下。
class Ball
{
public:
const int r = 8; //定义球的半径
const int speed = 1; //定义球的飞行速度
int ballx, bally; //定义球的坐标
int addx, addy; //表示球的飞行方向
//设置两个个标志量
bool go; //小球是否发射
bool iscatch; //木板是否捕捉到了小球
//构造函数 使小球初始化时位于木板中心上
Ball(int board_wide)
{
ballx = WINDOW_WIDE / 2;
bally = WINDOW_HEIGHT - board_wide - r - 1;
//初始时小球向右上发射
addx = 1;
addy = -1;
go = 0; //初始化状态 小球未发射出去
iscatch = 1; //初始化状态 球被木板接住
};
//小球移动函数
void Move(Bricks &brick, Board &board)
{
BeginBatchDraw(); //开启批量画图模式 目的是消除闪烁
//处理边界:左,右,上边界要反弹
if (ballx >= WINDOW_WIDE - r || ballx <= r) { addx *= -1; }
if (bally <= r) { addy *= -1; }
//若小球触及下边界 说明木板板没有接住小球 退出