cocos creator实例--游戏Bad Piggies中的一些物理特性的分析 | 附代码

这篇文章取材于Bad Piggies游戏,主要是来分析学习creator的一些物理特性。

项目准备

  • 新建空白项目工程phys;
  • 添加res、scripts、scenes文件夹;
  • 导入图片资源在res目录下;
  • 保存场景文件game到scenes目录下;
  • 准备工作完毕。

功能实现

我们这里为了学习研究creator的物理特性,只有是从刚体、碰撞、关节等组件的属性来着手。

1.球在重力作用下的自由下落

刚体组件

这一点我们是模拟一个球,在重力作用下的下坠;与地面接触之后的弹起的效果。

  • 先添加一个球ball;
  • 再添加一个地面floor;
  • 对ball添加刚体组件:添加组件----物理组件----RigidBody;

  • 我们还需要在脚本中开启物理世界;

这里新建ts脚本,在onLoad()中添加下面代码;如果不开启,球不会受到物理作用。

    onLoad () {
        //开启物理世界
        cc.director.getPhysicsManager().enabled = true;
    }

到这里,球就实现了往下坠落的效果。

 

碰撞组件

刚体与刚体之间想要发生作用,需要添加碰撞体组件;这里我们添加一个圆形的碰撞体。

  • 物理组件----Collider----Circle

  • 设置碰撞体的半径:修改Radius,使他适合球形大小。

下面我们添加一个地面,是球坠下之后可以弹起。

  • 添加单色精灵floor;
  • 设置颜色#686464、大小960*50、位置(0,-280),如下;

  • 添加刚体组件;

  • 添加碰撞体组件

  • 将地面的刚体类型设置成static,就不会受到重力的影响而下坠,会静止在那里。
  • 调整球和地面的:摩擦系数Friction;
  • 调整球和地面的:弹性系数Restitution;

可以看到球一直在下坠和弹起了。

2.BadPiggies游戏中小车的下坠和向前滑行

先来模仿BadPiggies游戏组建一个简单的车的样子,如下图;车在重力作用下会下坠,然后会自动调整成两轮向前滑行。

下面是给车的各个部件,添加物理组件;包括车身box、两个车轮架wheel_body、两个车轮wheel。

  • 车身box添加刚体组件RigidBody;
  • 连个车轮架子添加刚体组件RigidBody;
  • 两个车轮添加关节组件Joint的Wheel属性
  • 将连个车轮架子的资源拖到关节组件的Connected Body上;

  • 调整wheel的关节节点组件里面的Connected Anchor的坐标位置。
  • 调整两轮子的扭矩(加速度)Max Motor Torque和马达速度(最大速度)Motor Speed:
  • 对两轮子添加圆形碰撞组件PhysicsCircleCollider,并设置半径Radius为轮子的半径,防止调到地面下了;
  • 对车身box添加方形碰撞组件PhysicsBoxCollider;
  • 车轮子没有转动,需要开启自动马达开关,在WheelJoint组件下的Enable Motor勾选;
  • 将两车轮架子wheel_body添加关节组件joint的weld属性,并挂载在车身box上;车身和轮子就不会散架了;
  • 调整wheel的WheelJoint组件里面的弹性系数Frequency为10,防止车轮架子塌下来;
  • 车轮架子wheel_body旋转Rotation之后,对关节Joint的WeldJoint组件里面的属性相对角度Reference Angle进行设置;
  • 对轮子架子wheel_body添加Collider多边形的碰撞体PhysicsPolygonCollider,使架子和车身不分开;

附:游戏中的一些物理属性:

//开启物理世界       
 cc.director.getPhysicsManager().enabled = true;   



        cc.director.getPhysicsManager().debugDrawFlags = 
        cc.PhysicsManager.DrawBits.e_aabbBit |      //轴向外边框
        cc.PhysicsManager.DrawBits.e_pairBit |      //粗侧阶段物体
        cc.PhysicsManager.DrawBits.e_centerOfMassBit |  //质心位置
        cc.PhysicsManager.DrawBits.e_jointBit |     //关节链接信息
        cc.PhysicsManager.DrawBits.e_shapeBit       //碰撞盒
        ;

刚体    RigidBody

        刚体    RigidBody
        GetMass(); //质量,不可直接赋值,需要通过碰撞体组件的密度和大小计算得到
        GravityScale//重力的影响大小
        linearVelocity//线速度
        linearDamping//线性衰减速度,空气摩擦力
        angularVelocity//旋转速度
        angularDamping//旋转衰减速度
        enabledContactListener//碰撞监听

刚体类型    cc.RigidBodyType


        刚体类型    cc.RigidBodyType
        Static:     静态刚体,零质量、零速度,即不会受到重力或速度的影响;但是可以设置它的位置来进行移动。如:地面
        Dynamic:    动态刚体,有质量,可以设置速度,会受到重力影响。如:弹球
        Kinematic:  运动刚体,零质量,可以设置速度,不会受到重力的影响;但是可以设置速度来进行移动。
        Animated:   动画刚体,从Kinematic衍生的类型,主要用于刚体与动画编辑结合使用。

物理碰撞形状

 物理碰撞形状
        Box     四边形
        Chain   链条
        Circle  圆形
        Polygon 多边形

物理碰撞    PhysicsCollider

        物理碰撞    PhysicsCollider
        sensor      指明碰撞体是否为传感器类型,传感器类型的碰撞体会产生碰撞回调,但是不会发生物理碰撞效果。
        density     碰撞体的密度,用于刚体的质量计算
        friction    碰撞体摩擦力,碰撞体接触时的运动会受到摩擦力的影响
        restitution 碰撞体的弹性系数,指明碰撞体碰撞时是否会受到弹力影响

源代码下载:

发布了265 篇原创文章 · 获赞 20 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ccnu027cs/article/details/103958130