CocosCreator微信小游戏入门实战《小猫钓鱼》(五):碰撞系统

本文详细介绍了如何在CocosCreator中使用内置的碰撞检测系统,包括建立碰撞分组、添加碰撞组件、实现碰撞回调函数等步骤,实现了鱼钩与鱼的碰撞交互,展示了碰撞效果及业务逻辑的实现。

转载请保留原文链接:https://blog.csdn.net/zzx023/article/details/83064115

 

做游戏就和做导演一样,所以我们才有cc.director,哈哈。

通过前面几节,我们的游戏中已经拥有了鱼钩、鱼这两位主角,并且它们试镜成功(动作系统没问题),接下来得把最重要得对话剧本交给它们了,也就是我们游戏当中鱼钩与鱼之间的交互。

 

鱼与鱼钩交互过程中,最重要得一点就是碰撞,我们大部分得业务逻辑都是碰撞时进行的,感谢CocosCreator内置了一个简单好用碰撞检测系统,使得我们可以很方便的进行碰撞相关的开发。

 

来,我们现在就开始吧。

首先我们需要先建立好碰撞分组,可以参考官方文档:

http://docs.cocos.com/creator/manual/zh/physics/collision/collision-group.html

 

打开项目设置面板,我们添加两个新的分组:Fish(鱼),Hook(鱼钩),同时勾选允许Fish与Hook产生碰撞。

 

接下来,我们把鱼和鱼钩的Group属性都设置为对应的分组。

 

 

注意咱们的鱼时预制体,修改完后要记得保存。鱼钩是上一节我们编写的Controller节点。

 

做完这些以后鱼和鱼钩还不会在游戏中产生碰撞,因为我们还缺少一个重要的前提条件:碰撞组件。

关于碰撞组件,官方文档有详细说明:

http://docs.cocos.com/creator/manual/zh/physics/collision/edit-collider-component.html

 

我们先给Controller添加一个碰撞组件BoxCollider,勾选Editing以后,可以在编辑器中通过鼠标拖动编辑碰撞盒的大小。

 

 

鱼的也加上

 

接下来我们在场景脚本的Onload方法中添加以下代码:

    onLoad () {

        var manager = cc.director.getCollisionManager();//获取碰撞检测系统

        manager.enabled = true;//默认碰撞检测系统是禁用的,需要手动开启碰撞检测系统

        manager.enabledDebugDraw = true;//开启后可在debug中显示碰撞区域

    },

 

在Controller中实现碰撞回掉函数

    onCollisionEnter: function (other , self) {

        other.color = cc.Color.RED;

    }

碰撞到的鱼,我们让它变红。

 

运行一下,我们在debug下看到所有的碰撞区域,并且可以看到碰撞后的效果:变红

 

Nice,关键部分已经完成,剩下的就是业务逻辑以及一些细节完善的东西的。

最后我们把收杆的动作以及钓到鱼的表现加上就完整了。

 

为了表现效果,我们调整一下Controller和Fish的锚点。

并且修改以下代码:

 

Hook.js:

cc.Class({

    extends: cc.Component,



    properties: {

        RegainSpeed : 320,

        isRegaining : {

            default : false,

            visible : false

        }

    },



    // LIFE-CYCLE CALLBACKS:



    // onLoad () {},



    start () {

        this.StartLine();

    },



    StartLine () {

        this.node.stopAllActions();

        this.node.runAction(cc.repeatForever(cc.moveBy(4,cc.p(0,-100))));

        this.isRegaining = false;

    },



    RegainLine () {//收杆

        if (this.isRegaining)

            return;

        this.node.stopAllActions();//停止下沉动作

        var duration = Math.abs(this.node.y) / this.RegainSpeed;

        if (duration < 5) duration = 5;//收杆事件太快,不足5秒的,按5秒来运动

        this.node.runAction(cc.moveTo(duration, cc.v2(0,0)).easing(cc.easeSineIn()));//收杆动作,通过easing来优化效果

        this.isRegaining = true;

    }



    // update (dt) {},

});

 

 

Controller.js:

    onCollisionEnter: function (other , self) {

        other.node.color = cc.Color.RED;

        var pHook = this.mHook.getComponent(Hook);

        pHook.RegainLine();//鱼钩收杆



        other.node.stopAllActions();

        other.node.group = "default";//设置碰撞分组,没必要继续判断和鱼钩的碰撞了

        other.node.parent = this.node;//钓到的鱼挂在鱼钩上

        other.node.setPosition(cc.v2(0,0));

        other.node.runAction(cc.repeatForever(cc.sequence(

            cc.rotateTo(0.5 , -60 * other.node.scaleX),

            cc.rotateTo(0.5 , -30 * other.node.scaleX)

        )));//钓到的鱼挣扎动作

    }

 

 

最终效果如下:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值