Cocos Creator 常用技巧總結(jié)

1: 全局變量

  • 如何定義和使用全局變
  • 定義和使用方法與JS中是否相同败徊。
// 不提倡的定義全局變量的方法
// a.js 
 Globals // 這是一個(gè)沒有var的變量
// 官方提供的定義全局變量的方法, 掛到window上面即可
// Globals.js
window.Globals = {
    name : w,
    age : 18
}
  • 創(chuàng)建這樣一個(gè)Globals.js腳本,就可以在任何地方運(yùn)用Globals .name 來訪問定義的name的值李皇。

2: 模塊訪問

  • 如果不想設(shè)太多的全局變量(因?yàn)榭赡軙斐扇治廴荆┫胖敲纯梢酝ㄟ^模塊來進(jìn)行訪問
// es5的模塊化(導(dǎo)出關(guān)鍵字 module.exports, 導(dǎo)入關(guān)鍵字 require )
//在test腳本中定義如下【module.exports為關(guān)鍵字】
module.exports= {
      name:“wgq”,
      age:18
 };
 
//可以在其他腳本中通過require進(jìn)行訪問
var test= require("test");
test.age = 20;
console.log(test.name)//wgq
console.log(test.age)//20
  • 這樣就可以方便的設(shè)置訪問自己想要的屬性

3: 插入插件

  • 相信大家寫js代碼會有一個(gè)自己的插件庫(常用函數(shù)庫)习贫,
  • 那么如何在creator中引用自己的插件呢乳愉?
  • 光創(chuàng)建一個(gè)插件腳本是不夠的兄淫,
  • 必須在腳本屬性檢查器中勾選導(dǎo)入為插件選項(xiàng)。
  • 這樣蔓姚,不必有任何聲明捕虽,就可以在任何地方引用插件中的函數(shù)了。
1.png

4: 獲取Creator中的Dom

  • 在web中赂乐,使用js可以獲取dom薯鳍,
  • 在Creator中使用js可以獲取組件和節(jié)點(diǎn)咖气。

5:獲取節(jié)點(diǎn)

  1. 通過拖曳
    i. 可以在一個(gè)節(jié)點(diǎn)的腳本中通過代碼聲明一個(gè)test屬性挨措,類型為cc.Node。

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

    ii. 這樣就會在腳本掛載的地方出來一個(gè)空的節(jié)點(diǎn)崩溪。

2.png

iii. 接著你就可以將層級管理器上的任意一個(gè)節(jié)點(diǎn)拖到這個(gè) test控件浅役,
然后通過代碼this.test就可以獲取到他,進(jìn)行一系列的操作伶唯。

2.通過代碼

  • 可以通過全局查找 cc.find(“Canvas/Menu/Back”)當(dāng) cc.find 只傳入第一個(gè)參數(shù)時(shí)觉既,將從場景根節(jié)點(diǎn)開始逐級查找

  • 可以通過子節(jié)點(diǎn)一層一層進(jìn)行查找

    var son1 = this.node.getChildByName("son1");
    var son2 = son1.getChildByName("son2");
    
  • 這里,son1是該節(jié)點(diǎn)this.node下的子節(jié)點(diǎn)乳幸,而son2為son1下的子節(jié)點(diǎn)瞪讼,可以通過getChildByName函數(shù)進(jìn)行一層一層查找。

  • 也可以不通過名字粹断,利用序列號進(jìn)行查找 例如以下son1中有很多個(gè)son2

3.png
  • 可以通過以下循環(huán)獲取到每一個(gè)son2:
var son2 = [];
for(var i=0;i<son1.childrenCount;i++){
    var son2[i] =  son1.chindren[i]
}

6:獲取組件

  • 在Creator中符欠,一個(gè)節(jié)點(diǎn)可以掛載多個(gè)組件,如下:
4.png
  • Canvas節(jié)點(diǎn)中有Canvas組件瓶埋,有g(shù)ama和wgq兩個(gè)腳本組件希柿,有Label渲染組件等诊沪。
    以son節(jié)點(diǎn)為例:
var son = this.node.getChildByName("son");
var label = son.getComponent(cc.Label);
//這樣便可獲取到son節(jié)點(diǎn)下的label組件,然后可以對組件進(jìn)行一些操作

7: 節(jié)點(diǎn)屬性

  • 節(jié)點(diǎn)有一些屬性曾撤,開發(fā)中我們總是會利用js來動態(tài)改變節(jié)點(diǎn)的屬性
var son = this.node.getChildByName("son");
//以下代碼 son為獲取到的節(jié)點(diǎn)
son.active = true or false //控制節(jié)點(diǎn)son的顯示隱藏
son.parent = father or ... //更改son節(jié)點(diǎn)的父節(jié)點(diǎn)
son.children //返回son節(jié)點(diǎn)下的子節(jié)點(diǎn)數(shù)組
son.childrenCount //返回送節(jié)點(diǎn)下的子節(jié)點(diǎn)數(shù)量
son.x  or son.y = 10//設(shè)定son節(jié)點(diǎn)的x端姚,y軸坐標(biāo)
son.rotation  = 90(度數(shù))//設(shè)定son節(jié)點(diǎn)的旋轉(zhuǎn)角度
son.scaleX = 2 (默認(rèn)為1)//設(shè)定son節(jié)點(diǎn)的縮放
son.width or son.height //更改son節(jié)點(diǎn)的長寬
son.color //設(shè)置顏色(默認(rèn)為白)
son.opacity = 200(0~255,默認(rèn)為255)//設(shè)置透明度

8:為節(jié)點(diǎn)動態(tài)添加組件

  • 有時(shí)候我們需要為節(jié)點(diǎn)動態(tài)添加一下組件
var myLabel = new cc.Node().addComponent(cc.Label); 
myLabel.string = "test";
myLable.node.parent = son;//設(shè)置節(jié)點(diǎn)
myLable.node.setPosition(300,200);//設(shè)置位置

9: 一些基礎(chǔ)操作

1 cc.Label相關(guān):

  • (1)動態(tài)創(chuàng)建cc.Label :
var node = new cc.Node('text'); 
node.addComonpnet(cc.Label);

*(2)設(shè)置文本內(nèi)容:

node.getComponent(cc.Label).string = 'test'; 
//設(shè)置大小:
node.getComponent(cc.Label).fontSize = 30 
//文本對齊:參考creator中
  • (3) 如何動態(tài)獲取文本的寬度:
  node.getComponent(cc.Label).string = 'test'; 
  var getWidth = node.width;

這樣即可獲得寬度挤悉;

注意事項(xiàng):要讓node所在父節(jié)點(diǎn)active =true渐裸,即讓js腳本調(diào)用onload函數(shù)之后,才能正確獲取with;

  • (4) 文本長度超出creator中設(shè)定長度時(shí)不顯示:
node.getComponent(cc.Label).overFlow = cc.Label.Overflow.CLAMP 

還有其它幾種模式暫時(shí)沒用到后續(xù)研究,這里說下含義,

  • NONE(無樣式)
  • CLAMP(截?cái)啵?/li>
  • SHRINK(自動縮小文字以適應(yīng)大屑夥取)
  • RESIZE_HEIGHT(自增長高度)

2.cc.Sprite相關(guān)

*(1)動態(tài)創(chuàng)建cc.Sprite :

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

*(2)設(shè)置圖片:

node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
  • a) 精靈幀獲取的獲取方法1(動態(tài)讀取異步加載):
new cc.SpriteFrame(texture); 

優(yōu)點(diǎn):動態(tài)加載橄仆,缺點(diǎn):會有異步問題

那么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中將圖片拉倒這個(gè)frame上。優(yōu)點(diǎn):初始化加載畏梆,方便使用您宪。缺點(diǎn):會有內(nèi)存大,加載速度慢

3.cc.Animation相關(guān)

  • (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中默認(rèn)有個(gè)playOnLoad屬性需要注意:含義是在第一次active設(shè)為可見的時(shí)候會自動播放動畫奠涌,如果不需要可以不勾選宪巨。

4.ToggleGroup相關(guān)

定義:組合框(多項(xiàng)中只能選擇一項(xiàng))

  • (1)怎么獲取toggle(其中的一項(xiàng)):
this.togglegroup.toggleItems[0];
// 這代碼訪問第一項(xiàng)溜畅。
  • (2)怎么獲取toogle是否選中:
this.togglegroup.toggleItems[0].check()捏卓;
// 調(diào)用check()方法

(3)備注:在onload獲取調(diào)用(onLoad其實(shí)好些ui組件都沒準(zhǔn)備好呢)

this.togglegroup.toggleItems.length
// 獲取的長度為0,

所以只能在start()函數(shù)中調(diào)用慈格,creator設(shè)定的

5.cc.Button相關(guān)

  • (1)設(shè)置按鈕灰態(tài):
node.getComponent(cc.Button).interactable = true;

與creator中的EnableAuto中配合怠晴;
表現(xiàn)上是會灰色了,
但是按鈕還是可以點(diǎn)擊浴捆,
還得通過事件回調(diào)來處理蒜田,按下return;

  • (2)事件注冊:
btn.on('touchend' || 'mouseup', function(e) {
  var btn =  e.currentTarget; 
// 在回調(diào)內(nèi)部獲取按鈕自己
};
  • (3)修改按鈕的圖片:即修改cc.Sprite組件选泻,參考上面cc.Sprite相關(guān)

6. Layout相關(guān)

(1)這個(gè)布局控件在孩子設(shè)置為隱藏的時(shí)候冲粤,會自動調(diào)整孩子的位置,可以設(shè)置為左對齊页眯,居中對齊等等梯捕;但是現(xiàn)在有個(gè)bug:在孩子的類型不同時(shí),自動調(diào)整孩子的位置時(shí)不對窝撵,需要用代碼控制孩子的位置傀顾,如果孩子多的話,最好還是不要用Layout布局忿族。

7.RichText相關(guān)

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

8.定時(shí)器相關(guān)

  • a 創(chuàng)建:
this.schedule(this.updatePlayerTime,1); 
// 參數(shù)1:callback 
// 參數(shù)2:間隔蝌矛;
// 備注:這個(gè)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. 只執(zhí)行一次:
this.scheduleOnce()

9.操作事件相關(guān)(點(diǎn)擊彈起移動事件)

//(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){}) 
// 離開精靈的時(shí)候會觸發(fā)這個(gè)事件

10.cc.EditBox相關(guān)

暫時(shí)未用到


二错英、進(jìn)階內(nèi)容:

1.全局系統(tǒng)事件:

  • a)發(fā)送:
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)事件回調(diào)函數(shù):
eventCallBack:function(e)    {       
  var data= e.detail;
};

2.節(jié)點(diǎn)動態(tài)創(chuàng)建銷毀:

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

3.根據(jù)現(xiàn)有的節(jié)點(diǎn)創(chuàng)建節(jié)點(diǎn):

var newNode = cc.instantiate(oldNode);

4.實(shí)例化預(yù)制:

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加載資源有沒有同名覆蓋的問題?? 開發(fā)中應(yīng)該避免出現(xiàn)同名文件
比如A目錄下a.png;
B目錄下也有a.png代碼中會顯示哪個(gè)png入撒,
如果用自動圖集肯定沒這問題, 圖集也不要重名

6.資源的釋放:

 cc.loader.releaseRes(resPath);

目前用在界面動態(tài)創(chuàng)建,
在關(guān)閉界面的時(shí)候用這個(gè)函數(shù)釋放當(dāng)前界面資源prefab;

看下cc.loader類中的釋放函數(shù)椭岩,目前項(xiàng)目中并沒有用到復(fù)雜的內(nèi)存釋放茅逮。

7.點(diǎn)A移動到點(diǎn)B,B有父節(jié)點(diǎn)判哥,坐標(biāo)如何轉(zhuǎn)換献雅?

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的文件名
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市塌计,隨后出現(xiàn)的幾起案子挺身,更是在濱河造成了極大的恐慌,老刑警劉巖锌仅,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件章钾,死亡現(xiàn)場離奇詭異,居然都是意外死亡热芹,警方通過查閱死者的電腦和手機(jī)贱傀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伊脓,“玉大人府寒,你說我怎么就攤上這事”ㄇ唬” “怎么了株搔?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長榄笙。 經(jīng)常有香客問我邪狞,道長祷蝌,這世上最難降的妖魔是什么茅撞? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮巨朦,結(jié)果婚禮上米丘,老公的妹妹穿的比我還像新娘。我一直安慰自己糊啡,他們只是感情好拄查,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棚蓄,像睡著了一般堕扶。 火紅的嫁衣襯著肌膚如雪碍脏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天稍算,我揣著相機(jī)與錄音典尾,去河邊找鬼。 笑死糊探,一個(gè)胖子當(dāng)著我的面吹牛钾埂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播科平,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼褥紫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞪慧?” 一聲冷哼從身側(cè)響起髓考,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弃酌,沒想到半個(gè)月后绳军,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矢腻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年门驾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多柑。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奶是,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竣灌,到底是詐尸還是另有隱情聂沙,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布初嘹,位于F島的核電站及汉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屯烦。R本人自食惡果不足惜坷随,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驻龟。 院中可真熱鬧温眉,春花似錦、人聲如沸翁狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽露懒。三九已至闯冷,卻和暖如春砂心,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛇耀。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工计贰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒂窒。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓躁倒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洒琢。 傳聞我的和親對象是個(gè)殘疾皇子秧秉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345