Cocos Creator 常用技巧总结

1: 全局变量

  • 如何定义和使用全局变
  • 定义和使用方法与JS中是否相同。
// 不提倡的定义全局变量的方法
// a.js 
 Globals // 这是一个没有var的变量
// 官方提供的定义全局变量的方法, 挂到window上面即可
// Globals.js
window.Globals = {
    name : w,
    age : 18
}
  • 创建这样一个Globals.js脚本,就可以在任何地方运用Globals .name 来访问定义的name的值。

2: ??榉梦?/h1>
  • 如果不想设太多的全局变量(因为可能会造成全局污染),那么可以通过模块来进行访问
// es5的??榛?导出关键字 module.exports, 导入关键字 require )
//在test脚本中定义如下【module.exports为关键字】
module.exports= {
      name:“wgq”,
      age:18
 };
 
//可以在其他脚本中通过require进行访问
var test= require("test");
test.age = 20;
console.log(test.name)//wgq
console.log(test.age)//20
  • 这样就可以方便的设置访问自己想要的属性

3: 插入插件

  • 相信大家写js代码会有一个自己的插件库(常用函数库),
  • 那么如何在creator中引用自己的插件呢?
  • 光创建一个插件脚本是不够的,
  • 必须在脚本属性检查器中勾选导入为插件选项。
  • 这样,不必有任何声明,就可以在任何地方引用插件中的函数了。
1.png

4: 获取Creator中的Dom

  • 在web中,使用js可以获取dom,
  • 在Creator中使用js可以获取组件和节点。

5:获取节点

  1. 通过拖曳
    i. 可以在一个节点的脚本中通过代码声明一个test属性,类型为cc.Node。

    //wgq.js
    properties: {
            test:{
                default:null,
                type:cc.Node
            }
    },
    

    ii. 这样就会在脚本挂载的地方出来一个空的节点。

2.png

iii. 接着你就可以将层级管理器上的任意一个节点拖到这个 test控件,
然后通过代码this.test就可以获取到他,进行一系列的操作。

2.通过代码

  • 可以通过全局查找 cc.find(“Canvas/Menu/Back”)当 cc.find 只传入第一个参数时,将从场景根节点开始逐级查找

  • 可以通过子节点一层一层进行查找

    var son1 = this.node.getChildByName("son1");
    var son2 = son1.getChildByName("son2");
    
  • 这里,son1是该节点this.node下的子节点,而son2为son1下的子节点,可以通过getChildByName函数进行一层一层查找。

  • 也可以不通过名字,利用序列号进行查找 例如以下son1中有很多个son2

3.png
  • 可以通过以下循环获取到每一个son2:
var son2 = [];
for(var i=0;i<son1.childrenCount;i++){
    var son2[i] =  son1.chindren[i]
}

6:获取组件

  • 在Creator中,一个节点可以挂载多个组件,如下:
4.png
  • Canvas节点中有Canvas组件,有gama和wgq两个脚本组件,有Label渲染组件等。
    以son节点为例:
var son = this.node.getChildByName("son");
var label = son.getComponent(cc.Label);
//这样便可获取到son节点下的label组件,然后可以对组件进行一些操作

7: 节点属性

  • 节点有一些属性,开发中我们总是会利用js来动态改变节点的属性
var son = this.node.getChildByName("son");
//以下代码 son为获取到的节点
son.active = true or false //控制节点son的显示隐藏
son.parent = father or ... //更改son节点的父节点
son.children //返回son节点下的子节点数组
son.childrenCount //返回送节点下的子节点数量
son.x  or son.y = 10//设定son节点的x,y轴坐标
son.rotation  = 90(度数)//设定son节点的旋转角度
son.scaleX = 2 (默认为1)//设定son节点的缩放
son.width or son.height //更改son节点的长宽
son.color //设置颜色(默认为白)
son.opacity = 200(0~255,默认为255)//设置透明度

8:为节点动态添加组件

  • 有时候我们需要为节点动态添加一下组件
var myLabel = new cc.Node().addComponent(cc.Label); 
myLabel.string = "test";
myLable.node.parent = son;//设置节点
myLable.node.setPosition(300,200);//设置位置

9: 一些基础操作

1 cc.Label相关:

  • (1)动态创建cc.Label :
var node = new cc.Node('text'); 
node.addComonpnet(cc.Label);

*(2)设置文本内容:

node.getComponent(cc.Label).string = 'test'; 
//设置大?。?node.getComponent(cc.Label).fontSize = 30 
//文本对齐:参考creator中
  • (3) 如何动态获取文本的宽度:
  node.getComponent(cc.Label).string = 'test'; 
  var getWidth = node.width;

这样即可获得宽度;

注意事项:要让node所在父节点active =true,即让js脚本调用onload函数之后,才能正确获取with;

  • (4) 文本长度超出creator中设定长度时不显示:
node.getComponent(cc.Label).overFlow = cc.Label.Overflow.CLAMP 

还有其它几种模式暂时没用到后续研究,这里说下含义,

  • NONE(无样式)
  • CLAMP(截断)
  • SHRINK(自动缩小文字以适应大?。?/li>
  • RESIZE_HEIGHT(自增长高度)

2.cc.Sprite相关

*(1)动态创建cc.Sprite :

var node = new cc.Node('text'); 
node.addComonpnet(ccSprite);

*(2)设置图片:

node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
  • a) 精灵帧获取的获取方法1(动态读取异步加载):
new cc.SpriteFrame(texture); 

优点:动态加载,缺点:会有异步问题

那么texture如何获???

// 很丑的写法, 不如用uikiller了
cc.loader.load({url: cc.mg.util.get_wxhead(userData.url), type: 'jpg'}, function (err, texture) {
                var head = new cc.SpriteFrame(texture);
                 dialog.getChildByName('face')
                .getChildByName('mask')
                .getChildByName('tx')
                .getComponent(cc.Sprite)
                .spriteFrame = head;
            });
  • b) 精灵帧获取的获取方法2(creator编辑器上面拖拽编辑好):
    界面绑定的脚本,即.js文件properties: 中定义 frame : cc.SpriteFrame,然后在creator中将图片拉倒这个frame上。优点:初始化加载,方便使用。缺点:会有内存大,加载速度慢

3.cc.Animation相关

  • (1)动画播放和停止:
node.getComponent(cc.Animation).play;
// node.$Animation.play;
node.getComponent(cc.Animation).stop();
  • (2)注册动画播放完成事件:
node.getComponent(cc.Animation).on('finished', function(){
  cc.log('finish')
};
  • (3)备注:creator中默认有个playOnLoad属性需要注意:含义是在第一次active设为可见的时候会自动播放动画,如果不需要可以不勾选。

4.ToggleGroup相关

定义:组合框(多项中只能选择一项)

  • (1)怎么获取toggle(其中的一项):
this.togglegroup.toggleItems[0];
// 这代码访问第一项。
  • (2)怎么获取toogle是否选中:
this.togglegroup.toggleItems[0].check();
// 调用check()方法

(3)备注:在onload获取调用(onLoad其实好些ui组件都没准备好呢)

this.togglegroup.toggleItems.length
// 获取的长度为0,

所以只能在start()函数中调用,creator设定的

5.cc.Button相关

  • (1)设置按钮灰态:
node.getComponent(cc.Button).interactable = true;

与creator中的EnableAuto中配合;
表现上是会灰色了,
但是按钮还是可以点击,
还得通过事件回调来处理,按下return;

  • (2)事件注册:
btn.on('touchend' || 'mouseup', function(e) {
  var btn =  e.currentTarget; 
// 在回调内部获取按钮自己
};
  • (3)修改按钮的图片:即修改cc.Sprite组件,参考上面cc.Sprite相关

6. Layout相关

(1)这个布局控件在孩子设置为隐藏的时候,会自动调整孩子的位置,可以设置为左对齐,居中对齐等等;但是现在有个bug:在孩子的类型不同时,自动调整孩子的位置时不对,需要用代码控制孩子的位置,如果孩子多的话,最好还是不要用Layout布局。

7.RichText相关

  • (1)用法
node.getComponent(cc.RichText).string = '<color=#FF0000>' +  '我是富文本' + '</c>';
  • (2)换行增加字符串
‘<br/>’;

8.定时器相关

  • a 创建:
this.schedule(this.updatePlayerTime,1); 
// 参数1:callback 
// 参数2:间隔;
// 备注:这个this一定要挂接在组件上的脚本
cc.director.getScheduler().scheduleCallbackForTarget(this,  function(){

},1,0);
  • b销毁:
this.unschedule(this.updatePlayerTime); 
// 销毁所有:
this.unscheduleAllCallbacks();

cc.director.getScheduler().unscheduleCallbackForTarget(this, this.timer);
// 销毁所有:
cc.director.getScheduler().unscheduleAllForTarget(this);
  • c. 只执行一次:
this.scheduleOnce()

9.操作事件相关(点击弹起移动事件)

//(1)弹起事件:
node.on('touchend' || 'mouseup', function(e) {})
//(2)按下事件、长按事件:
node.on('touchstart',function(e){})
//(3)移动事件:
node.on('touchmove',function(e){})
//(4)取消事件:
node.on('touchcancel',function(e){}) 
// 离开精灵的时候会触发这个事件

10.cc.EditBox相关

暂时未用到


二、进阶内容:

1.全局系统事件:

  • a)发送:
var data= {};
cc.systemEvent.emit('eventName', data); 
//没有data:
cc.systemEvent.emit('eventName');
  • b)注册事件:
cc.systemEvent.on('eventName', this.eventCallBack, this);
  • c)取消事件注册:
cc.systemEvent.off('eventName', this.eventCallBack, this);
  • d)事件回调函数:
eventCallBack:function(e)    {       
  var data= e.detail;
};

2.节点动态创建销毁:

var node = new cc.Node("name"); 
node.destroy();

3.根据现有的节点创建节点:

var newNode = cc.instantiate(oldNode);

4.实例化预制:

cc.loader.loadRes('prefab/resName', cc.Prefab, function(err, prefab){
     var newNode = cc.instantiate(prefab);
});

5.资源的加载:

cc.loader.load();
cc.loader.loadRes();
cc.loader.loadResArray();
cc.loader.loadResDir();

cc.loader.loadResDir加载资源有没有同名覆盖的问题?? 开发中应该避免出现同名文件
比如A目录下a.png;
B目录下也有a.png代码中会显示哪个png,
如果用自动图集肯定没这问题, 图集也不要重名

6.资源的释放:

 cc.loader.releaseRes(resPath);

目前用在界面动态创建,
在关闭界面的时候用这个函数释放当前界面资源prefab;

看下cc.loader类中的释放函数,目前项目中并没有用到复杂的内存释放。

7.点A移动到点B,B有父节点,坐标如何转换?

var pos4 = this.pointB.convertToWorldSpaceAR(cc.p(0,0));
var pos5 = this.pointA.parent.convertToNodeSpaceAR(pos4);
var moveTo = cc.moveTo(0.5, pos5);

8.场景切换:

cc.director.loadScene(scene_name, callback); 
//scene_name为creator中.fire的文件名
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352