下面继续修改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为模板的节点。
