一、常用节点和组件接口
节点状态和层级操作
我们通过this.Node
访问当前脚本所在节点
激活或关闭节点
我们可以通过修改节点的active
属性来对它进行关闭或激活的操作,默认情况下,节点处于激活状态。
this.Node.active = faulse ; //节点关闭
当一个节点处于关闭状态下时,此节点上挂载的所有组件都被禁用,同时它所有子节点上挂载的组件也被禁用,但子节点的active
属性并未更改,父节点一旦被激活子节点上的组件也被激活。
若节点处于可被激活的状态时,我们可以通过修改节点的active
属性为true
来直接激活该节点,之后激活的操作有:
1.激活该节点下所有active属性为true的子节点
2.该节点及其子节点上挂载的所有组件被激活,他们中的update
方法每帧都被执行
3.这些组件上onEnable
方法也被执行
若节点已被激活,通过修改active
属性为false
会触发操作:
1.在场景中隐藏该节点和节点下的所有子节点
2.该节点和所有子节点上的所有组件都将被禁用,也就是不会再执行这些组件中的 update 中的代码
3.这些组件上如果有 onDisable 方法,这些方法将被执行
更改父节点
令父节点为parentNode
,子节点为this.node
this.node.parent = parentNode;
或
this.node.removeFromParent(false);//如果不传入参数(false),则该节点上的绑定事件及action 会被默认清空
parentNode.addChild(this.node);
搜索节点的子节点
返回子节点数目this.node.childrenCount
返回所有子节点的数组this.node.children
注意:这两个API只返回该节点的子节点,而不反回子节点的子节点
更改节点位置
this.node.x = 100;
this.node.y =50;
//直接对节点的坐标赋值
this.node.setPosition(100,50)
this.node.setPosition(cc.v2(100,50));
或
this.node.position = cc.v2(100,50);
更改节点旋转度
this.node.setRotation (90);
//或
this.node.Rotation=90;
更改节点锚点
this.node.setAnchorPoint(1,0);
更改节点透明度和颜色
在使用Sprite和label等渲染组件时,更改颜色和透明度的操作只能在实例上进行,因为这些渲染组件并没有添加更改颜色和透明度的接口。比如我们有一个mySprite
的sprite实例:
//更改颜色
mySprite.node.color = cc.Color.RED;
//更改透明度
mySprite.node.opacity = 50;
常见组件接口
cc.component 是所有组件的基底,任何组件都包含以下常见组件:
*this.node :该组件所属节点实例
*this.enabled :是否每帧执行组建的 update 方法,同时也控制渲染组件是否显示
*update :作为组件的成员方法,在组件的enabled属性为true时,每帧都执行的代码
*onLoad :在组件的节点进行初始化时执行
*start:会在该组件第一次 update 之前执行,通常用于需要在所有组件的 onLoad 初始化完毕后执行的逻辑
二、生命周期回调
用户只要定义特定的回调函数,Creator就会在特定时间自动执行相关脚本,用户不需要手动调试。
COCOS为用户提供了以下的回调函数:
onLoad
start
update
lateUpdate
onDestroy
onDisable
onEnable
onLoad
组件脚本初始化阶段,我们提供了onLoad
函数,在每次节点首次被激活时执行,如初次场景载入。在 onLoad 阶段,保证了你可以获取到场景中的其他节点,以及节点关联的资源数据。onLoad函数总在任何start函数之前执行,可以利用这一点实现脚本执行顺序的安排。我们通常在onLoad函数部分执行一些初始化操作:
cc.Class({
extrends : cc.component,
properties : {
bulletSprite : cc.spriteFrame,
gun : cc.Node
},
onLoad : function () {
this._bulletRect = this.bulletSprite.getRect();
this.gun = cc.find('hand/weapon', this.node);
}
});
start
start 函数会在第一次激活前,也就是第一次执行update之前执行。start用于初始化一些中间变量,这些中间变量会在之后的update函数中频繁变换,所以需要在第一次执行update之前进行初始化。
cc.Class ({
extrends : cc.component,
start : function () {
this._time =0.0;
},
update : function (dt) {
this._time += dt;
if ( this._timer >= 10.0 ) {
console.log('I am done!');
this.enabled = false;
}
}
})
update
游戏开发的一个关键点是在每一帧渲染前更新物体的行为,状态和方位。这些更新操作通常都放在 update 回调中。
cc.Class ({
extrends : cc.component,
update : function (dt) {
this.node.setPosision(0.0,40*dt);
}
});
lateUpdate
update 会在动画更新前执行,所以,如果我们想在动效更新之后执行某些操作,这时候就可以用到lateUpdate
这个函数。
cc.Class({
extends: cc.Component,
lateUpdate: function (dt) {
this.node.rotation = 20;
}
});
onEable
当组件的 enabled 属性从 false 变为 true 时,
或者所在节点的 active 属性从 false 变为 true 时,
会激活 onEnable 回调。
倘若节点第一次被创建且 enabled 为 true,则会在 onLoad 之后,start 之前被调用。
onDisable
当组件的enabled属性从true变为false时
或所在节点的active属性从true变为false时
激活onDisable回调函数。
onDestroy
当组件或者所在节点调用了 destroy(),则会调用 onDestroy 回调,并在当帧结束时统一回收组件。
三、创建和销毁节点
创建新节点
除了在场景编辑内创造节点,我们也可以在脚本内直接创造节点。通过new cc.Node()
将它添加到场景中。
cc.Class({
extrends : cc.component,
properties : {
sprite : {
default : null,
type : cc.spriteFrame
}
},
start : function (){
var node =new cc.Node('sprite');
var sp = node.addComponent(cc.sprite);
sp.spriteFrame = this.sprite;
node.parent = this.node;
}
});
克隆已有节点
我们可以通过cc.instantiate
动态的在场景中克隆已有节点,如:
cc.Class({
extrends : cc.component,
properties : {
sprite : {
default : null,
type : cc.spriteFrame
}
},
start : function () {
var scene = cc.director.getSence();
var node = cc.instantiate(this.target);
node.parent = scene;
node.setPosition(0,0);
}
});
创建预制节点
与克隆节点的方法相同只是将预制的节点类型设置为cc.Prefab
propertities : {
target : {
default : null ,
type : cc.Prefab
}
};
销毁节点
通过node.destroy()来销毁节点,销毁节点并不会立即移除,而是在当前帧逻辑结束后统一进行。
cc.Class({
extends: cc.Component,
properties: {
target: cc.Node,
},
start : function () {
setTimeOut (function () {
this.target.destroy();
}.bind(this), 5000);
},
update: function (dt) {
// cc.isValid 判断是否已被销毁
if (cc.isValid(this.target)) {
this.target.rotation += dt * 10.0;
}
},
});