Cocos Creator 访问节点和组件(摘自官方文档)
你可以在属性检查器里修改节点和组件,也能在脚本中动态修改。动态修改的好处是能够在一段时间内连续地修改属性、过渡属性,实现渐变效果。脚本还能够响应玩家输入,能够修改、创建和销毁节点或组件,实现各种各样的游戏逻辑。要实现这些效果,你需要先在脚本中获得你要修改的节点或组件。 在本篇教程,我们将介绍如何
获得组件所在的节点 获得组件所在的节点很简单,只要在组件方法里访问 start: function () {
var node = this.node;
node.x = 100;
}
获得其它组件 你会经常需要获得同一个节点上的其它组件,这就要用到 start: function () {
var label = this.getComponent(cc.Label);
var text = this.name + ' started';
// Change the text in Label Component
label.string = text;
}
你也可以为 var label = this.getComponent("cc.Label");
在节点上也有一个 start: function () {
cc.log( this.node.getComponent(cc.Label) === this.getComponent(cc.Label) ); // true
}
如果在节点上找不到你要的组件, start: function () {
var label = this.getComponent(cc.Label);
if (label) {
label.string = "Hello";
}
else {
cc.error("Something wrong?");
}
}
获得其它节点及其组件仅仅能访问节点自己的组件通常是不够的,脚本通常还需要进行多个节点之间的交互。例如,一门自动瞄准玩家的大炮,就需要不断获取玩家的最新位置。Cocos Creator 提供了一些不同的方法来获得其它节点或组件。 利用属性检查器设置节点 最直接的方式就是在属性检查器中设置你需要的对象。以节点为例,这只需要在脚本中声明一个 type 为 // Cannon.js
cc.Class({
extends: cc.Component,properties: {
// 声明 player 属性
player: {
default: null,type: cc.Node
}
}
});
这段代码在
接着你就可以将层级管理器上的任意一个节点拖到这个 Player 控件: 这样一来它的 player 属性就会被设置成功,你可以直接在脚本里访问 player: // Cannon.js
var Player = require("Player");
cc.Class({
extends: cc.Component,type: cc.Node
}
},start: function () {
var playerComp = this.player.getComponent(Player);
this.checkPlayer(playerComp);
},// ...
});
利用属性检查器设置组件 在上面的例子中,如果你将属性的 type 声明为 Player 组件,当你拖动节点 "Player Node" 到属性检查器,player 属性就会被设置为这个节点里面的 Player 组件。这样你就不需要再自己调用 // 声明 player 属性,这次直接是组件类型
player: {
default: null,type: Player
}
},start: function () {
var playerComp = this.player;
this.checkPlayer(playerComp);
},136); font-style:italic">// ...
});
你还可以将属性的默认值由 查找子节点有时候,游戏场景中会有很多个相同类型的对象,像是炮塔、敌人和特效,它们通常都有一个全局的脚本来统一管理。如果用属性检查器来一个一个将它们关联到这个脚本上,那工作就会很繁琐。为了更好地统一管理这些对象,我们可以把它们放到一个统一的父物体下,然后通过父物体来获得所有的子物体: // CannonManager.js
cc.Class({
extends: cc.Component,start: function () {
this.cannons = [];
this.cannons = this.node.getChildren();
}
});
这里的 你还可以使用 this.node.getChildByName("Cannon 01");
如果子节点的层次较深,你还可以使用 cc.find("Cannon 01/Barrel/SFX",this.node);
全局名字查找 当 this.backNode = cc.find("Canvas/Menu/Back");
访问已有变量里的值如果你已经在一个地方保存了节点或组件的引用,你也可以直接访问它们,一般有两种方式: 通过全局变量访问
让我们试着定义一个全局对象 // Globals.js,this file can have any name
window.Global = {
backNode: null,backLabel: null,};
由于所有脚本都强制声明为 "use strict",因此定义全局变量时的 // Back.js
cc.Class({
extends: cc.Component,onLoad: function () {
Global.backNode = this.node;
Global.backLabel = this.getComponent(cc.Label);
}
});
初始化后,你就能在任何地方访问到 // AnyScript.js
cc.Class({
extends: cc.Component,136); font-style:italic">// start 会在 onLoad 之后执行,所以这时 Global 已经初始化过了
start: function () {
var text = 'Back';
Global.backLabel.string = text;
}
});
通过模块访问 如果你不想用全局变量,你可以使用 // Global.js,now the filename matters
module.exports = {
backNode: null,sans-serif; font-size:16px; line-height:25.6px"> 每个脚本都能用 |