下面继续修改Game脚本,在onLoad()
方法后面添加生成糖果的逻辑,代码如下
onLoad: function () {
// 获取地平面的 y 轴坐标
this.groundY = this.ground.y + this.ground.height/2;
// 生成一个新的糖果
this.spawnNewStar();
},
spawnNewStar: function() {
// 使用给定的模板在场景中生成一个新节点
var newStar = cc.instantiate(this.starPrefab);
// 将新增的节点添加到 Canvas 节点下面
this.node.addChild(newStar);
// 为糖果设置一个随机位置
newStar.setPosition(this.getNewStarPosition());
},
getNewStarPosition: function () {
var randX = 0;
// 根据地平面位置和主角跳跃高度,随机得到一个糖果的 y 坐标
var randY = this.groundY + Math.random() *
this.player.getComponent('Player').jumpHeight + 50;
// 根据屏幕宽度,随机得到一个糖果 x 坐标
var maxX = this.node.width/2;
randX = (Math.random() - 0.5) * 2 * maxX;
// 返回糖果坐标
return cc.v2(randX, randY);
},
这里需要注意以下几个问题
(1)节点下的y属性对应的是锚点所在的y坐标,因为锚点默认在节点的中心,所以需要加上地面高度的一半,才是地面的y坐标
(2)instantiate()方法的作用是:克隆指定的任意类型的对象,或者从Prefab实例化出新节点,返回值为Node或者Object
(3)Node下的addChild()方法的作用是将新节点建立在该节点的下一级,所以新节点的显示效果在该节点之上。
(4)Node下的setPosition()方法的作用是设置节点在父节点坐标系中的位置。可以通过两种方式设置坐标点:一是传入两个数值x和y;二是传入cc.v2(x, y)(类型为cc.Vec2的对象)
(5)通过Node下的getComponent()方法可以得到该节点上挂载的组件引用。
保存脚本后,单击“预览游戏”按钮,在浏览器中可以看到游戏开始后动态生成了一颗糖果,如图8.38所示。采用同样的方法,可以在游戏中动态生成任何预先设置好的以Prefab为模板的节点。