接下来要添加主角收集糖果的行为逻辑了
糖果要随时可以获得主角节点的位置,才能判断它们之间的距离是否小于可收集距离
每个糖果都是在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;
}
},