• 基于Qt实现的“合成大西瓜”小游戏


    资源下载地址:https://download.csdn.net/download/sheziqiong/85788271
    资源下载地址:https://download.csdn.net/download/sheziqiong/85788271

    主要流程

    整体流程

    实现思路:通过开设 Mainscene 界面,定义水果类 fruit,实现各种操作。

    算法或公式

    核心算法:二维碰撞

    原理:由于两个小球碰撞,切线上的速度都是互相平行的,没有作用力而连心线上是相互碰撞的(如下图所示),会有作用力,所以我们只需要求出球 1 和球 2 的连心线方向上的速度值。然后再根据动量守恒定律和机械能守恒定律求出碰撞后的球 1 和球 2 的连心线方向。最后再互相加上各自在切线上的速度即可得到各自碰撞后的 x 速度,y 速度。

    和 v1t : 是球 1 在连心线方向和切线方向上的投影速度

    和 v2t : 是球 2 在连心线方向和切线方向上的投影速度

    球 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ’ : 球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碰撞后法向速度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    速度矢量(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);
    
    • 1
    • 2
    • 3
    • 4

    合成算法

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    收获

    单元测试

    (开始界面)

    (游戏暂停)

    (游戏进行中)

    资源下载地址:https://download.csdn.net/download/sheziqiong/85788271
    资源下载地址:https://download.csdn.net/download/sheziqiong/85788271

  • 相关阅读:
    Android PreferenceActivity添加ToolBar
    JavaWeb---- (1)互联网通信流程(超详细)
    Spring Cloud Stream绑定器架构解析与开发
    LTspice 电路仿真入门
    终于,进亚马逊了~
    离线语音识别PocketSphinx(一)
    MobileNetV3
    UOJ#748-[UNR #6]机器人表演【dp】
    JSON 和 XML 的区别
    Java单链表
  • 原文地址:https://blog.csdn.net/newlw/article/details/125473833