资源下载地址:https://download.csdn.net/download/sheziqiong/85788271
资源下载地址:https://download.csdn.net/download/sheziqiong/85788271
整体流程
实现思路:通过开设 Mainscene 界面,定义水果类 fruit,实现各种操作。
算法或公式
核心算法:二维碰撞
原理:由于两个小球碰撞,切线上的速度都是互相平行的,没有作用力而连心线上是相互碰撞的(如下图所示),会有作用力,所以我们只需要求出球 1 和球 2 的连心线方向上的速度值。然后再根据动量守恒定律和机械能守恒定律求出碰撞后的球 1 和球 2 的连心线方向。最后再互相加上各自在切线上的速度即可得到各自碰撞后的 x 速度,y 速度。
和 v1t : 是球 1 在连心线方向和切线方向上的投影速度
球 1 的速度方向,等于 v1n + v1t
球 2 的速度方向,等于 v2n + v2t
distance = Math.sqrt(Math.pow((ball1.pointX - ball2.pointX),2) + Math.pow((ball1.pointY - ball2.pointY),2));
radius = ball1.r + ball2.r;
dx = ball1.pointX - ball2.pointX
dy = ball1.pointY - ball2.pointY
ex = dx / radius;
ey = dy / radius; // 获取连心线的单位向量(ex,ey)
= ex * ball1.vx + ey * ball1.vy
= ex * ball2.vx + ey * ball2.vy
’ : 球1碰撞后的速度方向,等于v1n’ + v1t
’ : 球2碰撞后的的速度方向,等于v2n’ + v2t
‘和v2n’ :
两个小球碰撞后的投影速度
假如这两个小球是一样大, v1n’和 v2n’取值就是:
’ = v2n
’ = v1n
并且根据动量守恒定律和机械能守恒定律得出:
和 v2 : 两个小球碰前速度.
和 m2 : 两个小球的质量
'和v2' :
两个小球碰后速度
double ux=-dy/distance,uy=dx/distance;//切向单位向量(ux,uy),方向为(ex,ey)逆时针旋转π/2
//球在两球连线方向上的速度投影为v=(vx,vy)·(ex,ey)
double v1=ex*balls[i].vx+ey*balls[i].vy;//i的法向速度
double v2=ex*balls[j].vx+ey*balls[j].vy;//j的法向速度
if (v2<v1) continue;//两球擦肩而过,不相撞
//球在切线方向上的速度投影为v'=(vx,vy)·(ux,uy)
double v11=ux*balls[i].vx+uy*balls[i].vy;//i的切向速度
double v22=ux*balls[j].vx+uy*balls[j].vy;//j的切向速度
//根据动量守恒和动能定理计算碰撞后两球连线方向上的速度u1和u2,其中K表示动能损失程度
double m1=balls[i].mass,m2=balls[j].mass;
double u1=K*((m1-m2)*v1+2*m2*v2)/(m1+m2);//i碰撞后法向速度
double u2=K*((m2-m1)*v2+2*m1*v1)/(m1+m2);//j碰撞后法向速度
速度矢量(vx,vy)=(u1ex+v11ux,u1ey+v11uy)·(i,j)
balls[i].vx=1*(u1*ex+v11*ux);
balls[i].vy=1*(u1*ey+v11*uy);
balls[j].vx=1*(u2*ex+v22*ux);
balls[j].vy=1*(u2*ey+v22*uy);
合成算法
combine(int i, int j)
{
Ball b;
initball(balls[i].type+1);
double vi=sqrt(balls[i].vx*balls[i].vx+balls[i].vy*balls[i].vy);
double vj=sqrt(balls[j].vx*balls[j].vx+balls[j].vy*balls[j].vy);
if (vi<vj)//合成的位置为速度较小的球
{
=b._x=balls[i].x;
=b._y=balls[i].y;
}
else {
=b._x=balls[j].x;
=b._y=balls[j].y;
}
vx=(balls[i].vx+balls[j].vx)/2.0;
vy=(balls[i].vy+balls[j].vy)/2.0;
ay=1;
falling=1;
balls[i]=b; //将合成的新球替换balls[i]
collideWall(i);
balls[j]=balls[balls.size()-1];
balls.pop_back(); //从balls数组中删除balls[j]
gamescore+=2*balls[i].type;
str.sprintf("score:%d",gamescore);
q->setText(str);
}
收获
单元测试
(开始界面)
(游戏暂停)
(游戏进行中)
资源下载地址:https://download.csdn.net/download/sheziqiong/85788271
资源下载地址:https://download.csdn.net/download/sheziqiong/85788271