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