摘要
有趣的物理小游戏总能让小伙伴们爱不释手,而 CocosCreator 的内置物理引擎让其开发变得更加简单。今天 KUOKUO 就做为大家带来物理的加速带,让主角小恐龙起飞!
正文
使用版本
- CocosCreator 版本 2.1.3
最终效果
物理系统
在 CocosCreator 中有两套碰撞系统,不是 Physic 开头的就不是物理碰撞,通常用来做简单的碰撞检测。若我们想构建物理世界,那就要用刚体和物理碰撞组件了。最常用的:RigidBody + PhysicsBoxCollider。
还需在 onLoad() 方法中开启物理引擎:
cc.director.getPhysicsManager().enabled = true;
物理碰撞
在勾选开启物理监听后,物理碰撞发生后会触发该刚体节点上绑定脚本中的碰撞回调。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BBE0NW0j-1581684893655)(http://cdn.kuokuo666.com/20200214/tt1.png)]
我们在碰撞物体上绑定脚本写下这几个回调方法,在发生碰撞后会依次的触发。
cc.Class({
extends: cc.Component,
properties: {
},
// 只在两个碰撞体开始接触时被调用一次
onBeginContact: function (contact, selfCollider, otherCollider) {
},
// 只在两个碰撞体结束接触时被调用一次
onEndContact: function (contact, selfCollider, otherCollider) {
},
// 每次将要处理碰撞体接触逻辑时被调用
onPreSolve: function (contact, selfCollider, otherCollider) {
},
// 每次处理完碰撞体接触逻辑时被调用
onPostSolve: function (contact, selfCollider, otherCollider) {
}
});
加速的实现
首先,我们要明白那 3 个参数的意义,尤其是 contact 最为重要。selfCollider 和 otherCollider 很容易理解,selfCollider 指的是自身节点上的碰撞体,ohterCollider 指的是发生碰撞的另一个碰撞体。那么这个 contact 是什么呢?它包含碰撞的信息,比如碰撞的位置和法向量,类型是 cc.PhysicsContact。我们怎么使用它呢?如图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbSgy6N9-1581684893656)(http://cdn.kuokuo666.com/20200214/tt3.png)]
加速的实现就是调用了设置切线速度的API。注意要在 onPreSolve 中,在处理信息之前。
onPreSolve: function (contact, selfCollider, otherCollider) {
contact.setTangentSpeed(1500);
},
不同地形实现
除了加速,我们还可以设置摩擦力,比如我们有两种地形,冰雪路面和沼泽地形。
// 冰雪
contact.setFriction(0.25);
// 沼泽
contact.setFriction(0.85);
物理系统常见问题
- 不在 onLoad 中开启物理系统,而是在 start 中开启,无效的!
- 未设置碰撞分组,无效果。
- 带有刚体的物理节点,位置不受父节点影响的。
- 更新了物理碰撞盒的属性没生效?因为没调用 apply() 方法!或者在组件 enabled 为 false 时改变。
- 勾选了 sensor 可就没碰撞效果了。
- 如果你使用了物理系统,就最好通过力来运动物体了,除非是 Static 或者 Animated 再直接改变属性。
- Rigidbody 有个 getLinearVelocityFromWorldPoint() 方法可以得到线速度,通过方向你就知道主角是用头顶的方块还是用脚踩的。
- 修改全局重力 cc.director.getPhysicsManager().gravity = cc.v2(0, 0);
- 如果手机太卡,记得把物理刷新频率从 60 降为 30。
结语
有意思吧!我们下篇文章讲讲射线检测。
O(∩_∩)O~~