cocos creator基础-(十五)碰撞检测系统

本文详细介绍了Cocos Creator中碰撞检测系统的使用方法,包括基本步骤、开启碰撞检测、响应碰撞事件、道具拾取案例及group与groupIndex的理解。通过实例讲解如何设置碰撞区域、开启碰撞检测系统并进行调试,以及实现碰撞开始、持续和结束的响应。
1: 掌握碰撞检测的基本步骤;
2: 掌握开启碰撞检测和响应碰撞;
3: 完成道具拾取案例,理解group与groupIndex;



1: creator有碰撞检测系统 +物理碰撞系统,这个是两个独立的模块;
2: 给creator的游戏世界中的物体来进行分组,指定节点的分组与分组的碰撞矩阵;
3: 代码中获取节点的分组和分组索引: group与groupIndex(0~n);
4: 为每个节点添加碰撞检测区域-->碰撞器(物体形状), 编辑碰撞区域;
5: 代码开启碰撞检测系统(默认是关闭碰撞检测),开启和关闭碰撞检测的调试:
  var manager = cc.director.getCollisionManager(); //
  manager.enabled = true; // 开启碰撞
  manager.enabledDebugDraw = true; // 允许绘制碰撞的区域
6: 碰撞检测函数响应,发生碰撞检测的节点,会调用这个节点上所有组件的统一的三个接口:
  onCollisionEnter: function (other, self) // 开始
  onCollisionStay: function (other, self) // 持续
  onCollisionExit: function (other, self) // 结束
  其中other是与这个节点碰撞的节点的碰撞器组件
  其中self是自身节点的碰撞器组件
  是碰撞器组件,不是节点-->碰撞器组件.node
 
开启游戏的碰撞检测脚本
cc.Class({
    extends: cc.Component,

    properties: {
        // foo: {
        //    default: null,      // The default value will be used only when the component attaching
        //                           to a node for the first time
        //    url: cc.Texture2D,  // optional, default is typeof default
        //    serializable: true, // optional, default is true
        //    visible: true,      // optional, default is true
        //    displayName: 'Foo', // optional
        //    readonly: false,    // optional, default is false
        // },
        // ...
        is_enbale: true,
        is_debug: true,
    },

    // use this for initialization
    onLoad: function () {
        if (this.is_enbale) {
            var manager = cc.director.getCollisionManager();
            manager.enabled = true; // 开启碰撞
            if (this.is_debug) {
                manager.enabledDebugDraw = true; // 调试状态绘制出我们物体的碰撞器的形状
            }
        }
    },

    // called every frame, uncomment this function to activate update callback
    // update: function (dt) {

    // },
});

 

 
碰撞检测脚本
cc.Class({
    extends: cc.Component,

    properties: {
        // foo: {
        //    default: null,      // The default value will be used only when the component attaching
        //                           to a node for the first time
        //    url: cc.Texture2D,  // optional, default is typeof default
        //    serializable: true, // optional, default is true
        //    visible: true,      // optional, default is true
        //    displayName: 'Foo', // optional
        //    readonly: false,    // optional, default is false
        // },
        // ...
    },

    // use this for initialization
    onLoad: function () {

    },

    // other是道具的碰撞器组件
    // self 是自己节点的碰撞器组件 
    // 碰撞器是一个组件,所以我们可以通过组件 -->节点
    // 碰撞开始
    onCollisionEnter: function (other, self) {
        console.log("other.name = ", other.node.name, other.node.group, other.node.groupIndex);
        if (other.node.groupIndex === 2) { // 与道具相撞
            var prop = other.node.getComponent("prop");
            console.log("我们捡到了道具:", prop.prop_type);
        }
    },

    // 碰撞持续
    onCollisionStay: function (other, self) {

    },
    // end 

    // 碰撞结束
    onCollisionExit: function (other, self) {

    },
    // called every frame, uncomment this function to activate update callback
    // update: function (dt) {

    // },
});

 

 

转载于:https://www.cnblogs.com/orxx/p/10453351.html

CocosCreator实现的 解救人质 游戏,学会碰撞检测rescue.7z // Bullet.js cc.Class({ extends: cc.Component, properties: { mSpeed: 300, }, // LIFE-CYCLE CALLBACKS: // onLoad () {}, start() { var manager = cc.director.getCollisionManager(); // 获取碰撞检测系统 manager.enabled = true; }, update(dt) { // 设置子弹移动,当超出屏幕范围未发生碰撞时自动销毁 this.node.y += this.mSpeed * dt; if (this.node.y > 580) { console.log('超出屏幕范围,子弹销毁!'); this.node.destroy(); } }, /** * 当碰撞产生的时候调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionEnter: function (other, self) { console.log('on collision enter'); if (other.tag == 1) { // 子弹碰到人质时,解救失败! console.log('解救人质失败!'); var failLabel = this.node.parent.getChildByName('failLabel'); failLabel.active = true; this.node.destroy(); } else if (other.tag == 2) { // 子弹碰到敌人时,解救成功! console.log('解救人质成功!'); var successLabel = this.node.parent.getChildByName('successLabel'); successLabel.active = true; this.node.destroy(); } }, /** * 当碰撞产生后,碰撞结束前的情况下,每次计算碰撞结果后调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionStay: function (other, self) { console.log('on collision stay'); }, /** * 当碰撞结束后调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionExit: function (other, self) { console.log('on collision exit'); } });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值