Cocos论坛九问九答
今天周未,Shawn將之前在Cocos論壇中回答的問(wèn)題,整理了部分繼續(xù)我的分享之路!
1. 既然有這么流暢的Cocos界面,為什么應(yīng)用使用它來(lái)做H5界面
問(wèn):既然有這么流暢的Cocos界面。為什么應(yīng)用使用RN來(lái)做界面,這是為什么呢?我覺(jué)得所有的Web界面都應(yīng)該用Cocoas 來(lái)替換啊。
答:使用游戲引擎APP也是可以的,我想到有幾個(gè)問(wèn)題
1. 游戲引擎制作UI成本較高,HTML+CSS+JS開(kāi)發(fā)UI效率和成本最優(yōu)的。
2. 游戲引擎的界面渲染機(jī)制不同(opengl),它比系統(tǒng)原生的渲染消耗更多電池電量。
3. 游戲界面其實(shí)是在普通app應(yīng)用上的一個(gè)opengl窗口,為了跨平臺(tái)使用了c++、js等語(yǔ)言,要調(diào)用原生設(shè)備的能力還需要在不同語(yǔ)言中橋接,既要會(huì)游戲引擎,又要會(huì)原生開(kāi)發(fā),人力成本也高
反饋:獲得樓主的贊
2. CocosCreator怎么引入外部庫(kù)?
問(wèn):怎么引入外部庫(kù),我引用了一個(gè)socket的庫(kù),在新手入門(mén)提到的socket已經(jīng)過(guò)期了,無(wú)法下載,現(xiàn)在我能在瀏覽器里面預(yù)覽,但無(wú)法打包發(fā)布
還有怎么改端口和服務(wù)器連接測(cè)試
-
方案1:將三方庫(kù)放入assets,在需要使用的地方使用requre引入
-
方案2:將三方庫(kù)放入assets,選中js代碼文件,在屬性編輯器上勾選“導(dǎo)入為插件”,大多三方庫(kù)導(dǎo)入的模塊為全局變量,類(lèi)似你在index.html中導(dǎo)入
-
方案3:在工程目錄下創(chuàng)建一個(gè)build-templates目錄,對(duì)應(yīng)build工程目錄結(jié)構(gòu),構(gòu)建時(shí)將三方庫(kù)復(fù)制到構(gòu)建工程中,創(chuàng)建自己的index.html模板,但是在調(diào)試時(shí)對(duì)三方庫(kù)的使是會(huì)報(bào)錯(cuò)的。強(qiáng)烈不推介這種方式。
-
方案4:可以使用npm管理三方庫(kù),代碼中使用requre引入,但官方不推介使用npm,會(huì)有冗余代碼在項(xiàng)目中,這個(gè)有點(diǎn)不爽。
3. creator中,如何給一個(gè)預(yù)制體中的按鈕添加一個(gè)點(diǎn)擊事件?
問(wèn):我制作了一個(gè)預(yù)制資源,這個(gè)預(yù)制資源中有一個(gè)按鈕。當(dāng)我在layout節(jié)點(diǎn)下面生成這個(gè)預(yù)制體后,如何給他上面的按鈕添加一個(gè)點(diǎn)擊事件,彈出一個(gè)提示框?在生成的時(shí)候我給他添加了一個(gè)標(biāo)簽,所以可以根據(jù)這個(gè) 標(biāo)簽?zāi)玫竭@個(gè)按鈕,但是怎么給他添加點(diǎn)擊事件?我用了this.button.node.on(),但是這個(gè)好像只能在onLoad中使用,在生產(chǎn)預(yù)制資源的方法中使用會(huì)報(bào) “on”沒(méi)有被定義的錯(cuò)。各位大神幫幫忙!
答:可以在實(shí)例化prefab時(shí),用代碼創(chuàng)建事件監(jiān)聽(tīng)
let node = cc.instantiate(prefab); this.layout.addChild(node); node.on(cc.Node.EventType.TOUCH_END, ?(touchEvent) => {cc.log('點(diǎn)擊事件在此'); })反饋:根據(jù)您的方法成功了,謝謝了。
4、如何獲取resources里的某個(gè)文件的真實(shí)安裝路徑?
問(wèn):在安卓和蘋(píng)果端需要取creator中resources文件里的文件用,問(wèn)下,這怎么獲取,有相關(guān)的api?
答:試試下面這個(gè)
>反饋:成為解決方案
5. cocos2djs 如何使用自帶的require?
問(wèn):如題, window系統(tǒng)命令行創(chuàng)建的cocos2d js 工程,無(wú)法使用cocos2d-html5自帶的require , 但js-test ,里有用到require。不解,把js-test用到require的相關(guān)js文件添加到j(luò)slist中 也出現(xiàn) require undefined …
答:cocos2d-js項(xiàng)目可以使用webpack或browserify進(jìn)行代碼編譯,文件以模塊的方式編寫(xiě),可以使用require、exports導(dǎo)入導(dǎo)出模塊。 我有一個(gè)demo,你可以參考一下,github地址:https://github.com/ShawnZhang2015/c2js-puremvc
游戲的源代碼放在js目錄下,使用browserify打包后輸出到src目錄。
此方法支持web和native。
6. protobufjs序列化后如何拼接上消息Id?
問(wèn):protobufjs序列化后得到的是arrayBuffer
? ?let pb = pbkiller.loadAll('proto', '');let player = new pb.UserLoginMsgReq(); ?player.openID = 0;player.logintype = 3;player.gameID = 3;let data = player.toArrayBuffer();如何在data前面加上消息ID 以便服務(wù)收到數(shù)據(jù)后 進(jìn)行反序列化?
答:你好我是pbkiller的開(kāi)發(fā)者,所有potobuf數(shù)據(jù)都需要事先定義,你可以參考下面的做法
//在proto中定義一個(gè)前后端通用的協(xié)議 message PBMessage {uint32 id = 0; //消息IDbytes data = 1; //上層協(xié)議(二進(jìn)制數(shù)據(jù)) } ... //游戲代碼中用法: let data = player.toArrayBuffer(); //實(shí)例化一個(gè)PBMessage消息 let message = new pb.PBMessage(); //設(shè)置消息ID和數(shù)據(jù) message.id = xxx; message.data = data; //將message序列化發(fā)給服務(wù)器,服務(wù)器需要做兩次反序列化 socket.send(message.toArrayBuffer());此方法需要前后端配合,后端解碼PBMessage,通過(guò)PBMessage.id將其路由給具體的處理函數(shù)解碼PBMessage.data。
7. 在選中構(gòu)建的時(shí)候選中調(diào)試模式怎么去掉左下角的 信息!
問(wèn):
答:構(gòu)建時(shí)關(guān)閉調(diào)試模式
再問(wèn):我是說(shuō), 在我需要開(kāi)啟調(diào)試模式的情況下.
再答:不好意思!用下面的方法可以
cc.director.setDisplayStats(false);反饋:謝謝咯
8. cocos creator打開(kāi)錯(cuò)誤
問(wèn):有沒(méi)有好心人能告訴我一下這個(gè)問(wèn)題是什么。難受剛下載下來(lái)什么都還沒(méi)做,就冒出個(gè)問(wèn)題出來(lái)。新手求大佬告知,關(guān)于這個(gè)問(wèn)題我真的頭大。
答:spawn是nodejs的執(zhí)行外部命令的函數(shù)(創(chuàng)建子進(jìn)程),我猜想有可能是環(huán)境變量問(wèn)題,運(yùn)行外部程序失敗了。
給你兩個(gè)方案:
你嘗試下可以正常編譯、預(yù)覽游戲嗎?如果可以,只是編輯器啟動(dòng)時(shí)報(bào)這個(gè)錯(cuò),暫時(shí)不理會(huì)它。
換用1.6的版本試試,是否也有這個(gè)問(wèn)題。
還有就是打開(kāi)Creator的開(kāi)發(fā)者工具:
反饋:非常感謝您對(duì)我的幫助,游戲能正常啟動(dòng),1.6的版本也有這個(gè)問(wèn)題,我現(xiàn)在調(diào)試一下看看。
9. creator中,如何給一個(gè)預(yù)制體中的按鈕添加一個(gè)點(diǎn)擊事件?
問(wèn):我制作了一個(gè)預(yù)制資源,這個(gè)預(yù)制資源中有一個(gè)按鈕。當(dāng)我在layout節(jié)點(diǎn)下面生成這個(gè)預(yù)制體后,如何給他上面的按鈕添加一個(gè)點(diǎn)擊事件,彈出一個(gè)提示框?在生成的時(shí)候我給他添加了一個(gè)標(biāo)簽,所以可以根據(jù)這個(gè) 標(biāo)簽?zāi)玫竭@個(gè)按鈕,但是怎么給他添加點(diǎn)擊事件?我用了this.button.node.on(),但是這個(gè)好像只能在onLoad中使用,在生產(chǎn)預(yù)制資源的方法中使用會(huì)報(bào) “on”沒(méi)有被定義的錯(cuò)!
答:可以在實(shí)例化prefab時(shí),用代碼創(chuàng)建事件監(jiān)聽(tīng)
let node = cc.instantiate(prefab); this.layout.addChild(node); node.on(cc.Node.EventType.TOUCH_END, (touchEvent) => {cc.log('點(diǎn)擊事件在此'); });反饋:根據(jù)您的方法成功了,謝謝了。
10. creator 觸摸事件關(guān)不掉?
問(wèn):
答:你上面this.btleft.on函數(shù)第二個(gè)參數(shù)是個(gè)匿名函數(shù),off時(shí)又是一個(gè)新的匿名函數(shù),當(dāng)然關(guān)不掉。給你兩個(gè)種方法:
你可以用targetOff,但會(huì)把所有事件給關(guān)了
將事件函數(shù)變成成員函數(shù)或子函數(shù)
反饋:回答被樓主贊了
11. 為什么我Label的字體大小不能調(diào)整?
問(wèn):字體font size 屬性有個(gè)鎖, 是怎么回事?數(shù)值也改變不了
答:Label處于SHRINK模式,Label的字體大小受node的Size約束,改變Size大小后就可以調(diào)整FontSize了
12. NODE節(jié)點(diǎn)和sprite組件和sprite節(jié)點(diǎn)關(guān)系?
問(wèn):NODE節(jié)點(diǎn)和sprite組件和new 出來(lái)的sprite節(jié)點(diǎn)是什么關(guān)系,官網(wǎng)說(shuō)的很迷糊。
答:給你打個(gè)比喻,節(jié)點(diǎn)像一個(gè)人,組件則像這個(gè)人身上的裝備,Sprite就像一件衣服,改變了節(jié)點(diǎn)的外觀。一個(gè)節(jié)點(diǎn)可以裝備多套裝備,裝備你還可以自己打造,就是自己寫(xiě)的組件代碼。想想常玩的游戲,如魔獸、英雄聯(lián)盟這些,英雄與裝備的設(shè)計(jì)。
上面的比喻只說(shuō)單個(gè)方向,再給你打個(gè)比方: 節(jié)點(diǎn)像一臺(tái)機(jī)甲(小時(shí)候看過(guò)神龍斗士沒(méi)有?),組件就像坐進(jìn)機(jī)甲里的操縱者,操縱者有自己的特性,讓機(jī)甲有不同的表現(xiàn)。而且這一臺(tái)機(jī)甲可以坐很多個(gè)人,也就是很多個(gè)組件。
你說(shuō)的 new出來(lái)的sprite,那是cocos2d-x/js中的概念了,在Creator中Sprite不能直接new出來(lái),是先有機(jī)甲,再有給機(jī)甲中添加一個(gè)Sprite
let node = new cc.Node(); let sprite = node.addComponent(cc.Sprite); sprite.xxx = yyy; // 給sprite賦值 node.x = 100; //給節(jié)點(diǎn)賦值 cc.log(sprite.node === node); // sprite內(nèi)部操縱node如果你覺(jué)得上面的方式創(chuàng)建一個(gè)Sprite很麻煩,你可以將他封裝一下,可以嘗試下面的方法:
cc.createComponent = function (componentType, parent) {let node = new cc.Node();if (parent instanceOf cc.Node) {node.parent = parent;}let component = node.addComponent(componentType);return component; };//創(chuàng)建一個(gè) let sprite = cc.createComponent(cc.Sprite); let label = cc.createComponent(cc.Label); 推薦你看下我寫(xiě)的節(jié)點(diǎn)與組件的概念分享
http://www.jianshu.com/p/fc46301305fa
http://www.jianshu.com/p/2b92157179d3
結(jié)語(yǔ)
兩個(gè)月前Shawn加班不多,每天都在論壇刷問(wèn)題,早、中、晚連刷三次,一次十多分鐘,比自己刷牙還積極!能幫助到別人自己也很高興,同時(shí)也能收獲很多。
這周遇到兩位Creator道友,在工作中遇到了困難,他們?cè)诤?jiǎn)書(shū)和Cocos論壇發(fā)現(xiàn),我的文章中提到與他們問(wèn)題相關(guān)的內(nèi)容,隨后聯(lián)系上我,有幸我提供的方案對(duì)他們有所幫助。有趣的是,還收得了他們的紅包酬謝,天啊,我的第一次,就被他們給奪走了(第一次付費(fèi)服務(wù)),我都沒(méi)來(lái)得及思考怎么會(huì)事,就發(fā)紅包給收了,在這里對(duì)這兩們道友說(shuō)聲感謝!
如果大家對(duì)我的文章、教程有什么建議和想法歡迎留言!
總結(jié)
以上是生活随笔為你收集整理的Cocos论坛九问九答的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 支持html文件格式的网盘,Word文档
- 下一篇: centos+nginx+wordpre