内容纲要
由于数学计算只能实现某些特定形状的物体相互碰撞,为了满足让更多不同形状的物体实现相互间的碰撞,我们需要使用物理系统。
  1. 给地面添加物理组件
  • 点中player,把Position的Y坐标改成0,点击添加组件,物理-Collider-Box。
    15-用物理系统实现玩家碰地面反弹插图
  • 点中ground,点击添加组件,物理-Collider-Box。
    15-用物理系统实现玩家碰地面反弹插图(1)
  • 注释player脚本里onLoad方法中的跳跃功能。
  1. 更改参数
  • 点中ground节点,把Type属性里的Dynamic(动态)改成Static(静态),点击保存场景。
    15-用物理系统实现玩家碰地面反弹插图(2)
  • 物理系统默认是关闭的,使用前需要输入代码使用。打开总控制脚本game,在onLoad方法里面增加代码,cc.director.getPhysicsManager.enabled = true;
    15-用物理系统实现玩家碰地面反弹插图(3)
  • 此时地面会随玩家的移动下移,解决办法是把ground节点的Type属性,重新改回Dynamic。
    15-用物理系统实现玩家碰地面反弹插图(4)
  1. 实现玩家落地后的反弹
  • 点中player节点,在属性管理器中找到RagidBody(刚体的物理运动),勾中开启碰撞监听。
    15-用物理系统实现玩家碰地面反弹插图(5)
  • 打开player脚本,输入代码。
onBeginContact(contact, selfCollider, otherCollider)
{
    if (otherCollider.node.name == 'ground')
    {
        var rb = selfCollider.getComponent(cc.RigidBody);
        rb.linearVelocity = cc.v2(0,0);
        rb.applyLinearImpulse(cc.v2(0, 3000), rb.getWorldCenter());
    }
}
  • contact表示碰撞信息,selfCollider代表物体自身的碰撞组件,对应player节点属性管理器中的PhysicsBoxCollider,otherCollider代表另一个对象的碰撞器,即ground。
  • 如果碰撞对象是地面,把它的RagidBody存储下来。cc.applyForce()表示施加一个力。3000表示施加力的大小。
  • rb.getWorldCenter()表示获取世界坐标系下的质心。
  • 实现弹起的关键在于,判断玩家和地面是否发生碰撞。
  • 物体下落时本身就有速度,我们需要清零向下的速度。即rb.linearVelocity。
  • 现在玩家可以实现落地后的反弹。

发表评论