接下来要添加主角收集糖果的行为逻辑了
糖果要随时可以获得主角节点的位置,才能判断它们之间的距离是否小于可收集距离
每个糖果都是在Game脚本中动态生成的
所以,在Game脚本生成candy节点实例时,将Game组件的实例传入糖果并保存起来就好了
之后可以随时通过game.player访问主角节点
打开Game脚本,在spawnNewStar()方法最后面添加newStar.getComponent('candy').game = this;,代码如下。
spawnNewStar: function() {// 使用给定的模板在场景中生成一个新节点var newStar = cc.instantiate(this.starPrefab);// 将新增的节点添加到 Canvas 节点下面this.node.addChild(newStar);// 为糖果设置一个随机位置newStar.setPosition(this.getNewStarPosition());newStar.getComponent('candy').game = this;},
保存后打开Candy脚本,利用Game组件中引用的player节点判断距离,在onLoad()方法后面添加名为getPlayerDistance()和onPicked()的方法,代码如下。
getPlayerDistance: function () {// 根据 player 节点位置判断距离var playerPos = this.game.player.getPosition();// 根据两点位置计算两点之间的距离var dist = this.node.position.sub(playerPos).mag();return dist;},onPicked: function() {// 当糖果被收集时,调用Game脚本中的接口,生成一个新的糖果this.game.spawnNewStar();// 然后销毁当前糖果节点this.node.destroy();},
节点下的getPosition()方法返回的是节点在父节点坐标系中的位置(x,y),即一个Vec2类型对象。同时,注意调用节点下的destroy()方法就可以销毁节点。然后在update()方法中添加每帧判断距离,如果距离小于pickRadius属性规定的收集距离,就执行收集行为,代码如下。
update: function (dt) {// 每帧判断和主角之间的距离是否小于收集距离if (this.getPlayerDistance() < this.pickRadius) {// 调用收集行为this.onPicked();return;}},
