一、常用节点和组件接口
节点状态和层级操作 我们通过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; } }, });