下面继续修改Game脚本,在onLoad()方法后面添加生成糖果的逻辑,代码如下

    1. onLoad: function () {
    2. // 获取地平面的 y 轴坐标
    3. this.groundY = this.ground.y + this.ground.height/2;
    4. // 生成一个新的糖果
    5. this.spawnNewStar();
    6. },
    7. spawnNewStar: function() {
    8. // 使用给定的模板在场景中生成一个新节点
    9. var newStar = cc.instantiate(this.starPrefab);
    10. // 将新增的节点添加到 Canvas 节点下面
    11. this.node.addChild(newStar);
    12. // 为糖果设置一个随机位置
    13. newStar.setPosition(this.getNewStarPosition());
    14. },
    15. getNewStarPosition: function () {
    16. var randX = 0;
    17. // 根据地平面位置和主角跳跃高度,随机得到一个糖果的 y 坐标
    18. var randY = this.groundY + Math.random() *
    19. this.player.getComponent('Player').jumpHeight + 50;
    20. // 根据屏幕宽度,随机得到一个糖果 x 坐标
    21. var maxX = this.node.width/2;
    22. randX = (Math.random() - 0.5) * 2 * maxX;
    23. // 返回糖果坐标
    24. return cc.v2(randX, randY);
    25. },

    这里需要注意以下几个问题

    (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为模板的节点。