接下来要添加主角收集糖果的行为逻辑了

    糖果要随时可以获得主角节点的位置,才能判断它们之间的距离是否小于可收集距离

    每个糖果都是在Game脚本中动态生成的

    所以,在Game脚本生成candy节点实例时,将Game组件的实例传入糖果并保存起来就好了

    之后可以随时通过game.player访问主角节点

    打开Game脚本,在spawnNewStar()方法最后面添加newStar.getComponent('candy').game = this;,代码如下。

    1. spawnNewStar: function() {
    2. // 使用给定的模板在场景中生成一个新节点
    3. var newStar = cc.instantiate(this.starPrefab);
    4. // 将新增的节点添加到 Canvas 节点下面
    5. this.node.addChild(newStar);
    6. // 为糖果设置一个随机位置
    7. newStar.setPosition(this.getNewStarPosition());
    8. newStar.getComponent('candy').game = this;
    9. },

    保存后打开Candy脚本,利用Game组件中引用的player节点判断距离,在onLoad()方法后面添加名为getPlayerDistance()和onPicked()的方法,代码如下。

    1. getPlayerDistance: function () {
    2. // 根据 player 节点位置判断距离
    3. var playerPos = this.game.player.getPosition();
    4. // 根据两点位置计算两点之间的距离
    5. var dist = this.node.position.sub(playerPos).mag();
    6. return dist;
    7. },
    8. onPicked: function() {
    9. // 当糖果被收集时,调用Game脚本中的接口,生成一个新的糖果
    10. this.game.spawnNewStar();
    11. // 然后销毁当前糖果节点
    12. this.node.destroy();
    13. },

    节点下的getPosition()方法返回的是节点在父节点坐标系中的位置(x,y),即一个Vec2类型对象。同时,注意调用节点下的destroy()方法就可以销毁节点。然后在update()方法中添加每帧判断距离,如果距离小于pickRadius属性规定的收集距离,就执行收集行为,代码如下。

    1. update: function (dt) {
    2. // 每帧判断和主角之间的距离是否小于收集距离
    3. if (this.getPlayerDistance() < this.pickRadius) {
    4. // 调用收集行为
    5. this.onPicked();
    6. return;
    7. }
    8. },