Cocos Creator 实现大厅+子游戏模式
轉(zhuǎn)載自:https://www.cnblogs.com/zhong-dev/p/10782834.html
大廳+子游戲的模式,在棋牌類型、教育類型游戲中比較常見,通常是安裝包里面只有大廳的資源和代碼,然后子游戲根據(jù)需求以熱更新的方式下載來提供給玩家。
之前一直負(fù)責(zé)的是cocos2dx-lua的開發(fā),lua作為腳本語言,非常適合做熱更新及大廳+子游戲模式的開發(fā)。而cocos creator使用的是js或者ts,作為腳本語言也是很方便做熱更新的,但是js編譯是把所有的腳本編譯成一個(gè)單獨(dú)的js文件,如果不做調(diào)整,會(huì)導(dǎo)致所有的大廳+游戲代碼編譯成一個(gè)單獨(dú)的js文件,是不太方便做成大廳+子游戲的模式的,這里要討論的就是如何調(diào)整,以做成大廳+子游戲的模式。
首先就是要將大廳、子游戲分開來構(gòu)建了,要不就是創(chuàng)建單獨(dú)的大廳+子游戲工程,要不就是將大廳或者子游戲的代碼、資源拷貝到一個(gè)構(gòu)建工程,然后用命令行工具或者直接使用GUI工具構(gòu)建。我這邊沒有單獨(dú)分開創(chuàng)建工程,選擇的是在構(gòu)建的時(shí)候通過腳本拷貝相關(guān)的資源,然后單獨(dú)構(gòu)建。
分開構(gòu)建/編譯好了資源之后,就是在app中怎么使用了。在lua版本中,引擎的資源加載方式是直接讀取指定目錄的腳本/資源,所以我們只要先將子游戲的腳本/資源下載好,再引入指定目錄的腳本就可以了。js作為腳本資源,思路上我們也是讀取對(duì)應(yīng)目錄的腳本,但是在creator版本中,引擎封裝了一套資源加載工具,每個(gè)資源對(duì)應(yīng)一個(gè)uuid,訪問資源的時(shí)候是使用uuid去尋找資源(我們使用cc.loader.loadRes傳入的是帶資源目錄的url,內(nèi)部會(huì)根據(jù)這個(gè)url找到uuid再來加載資源),構(gòu)建/編譯項(xiàng)目的時(shí)候,會(huì)生成一個(gè)setting.js/jsc的文件,這個(gè)文件就是uuid和實(shí)際資源路徑的對(duì)應(yīng)表。所以我們需要做的就是如何引入子游戲生成的這個(gè)setting文件。參考論壇網(wǎng)友的思路,就是引入另外一個(gè)js腳本,在該腳本中再去讀取對(duì)應(yīng)子游戲的setting文件,合并到大廳的setting配置中,然后再跳轉(zhuǎn)到對(duì)應(yīng)的游戲場(chǎng)景,上代碼:
// 首先還是要設(shè)置好搜索路徑var searchPaths = jsb.fileUtils.getSearchPaths();searchPaths.unshift(cc.JS_DIR);jsb.fileUtils.setSearchPaths(searchPaths); // 判斷是否已經(jīng)加載過子游戲的settingif (!cc.gameSetting){window.require(js_path + 'src/settings.js');settings = window._CCSettings;window._CCSettings = undefined;// 防止重復(fù)加載腳本if (!cc.jsList[js_path]){require(js_path + 'src/' + (settings.debug ? 'project.dev.js' : 'project.js'));cc.jsList[js_path] = true}}else{settings = cc.gameSetting}// 合并assetTypesvar gameAssetTypes = settings.assetTypes;settings.assetTypes = baseSetting.assetTypes;if (gameAssetTypes && settings.assetTypes){for (var typeIndex in gameAssetTypes) {var type = gameAssetTypes[typeIndex];//不包含就塞到settings里面去if (settings.assetTypes.indexOf(type) == -1) {settings.assetTypes.push(type);}}for (var uuidKey in settings.rawAssets.assets) {var index = settings.rawAssets.assets[uuidKey][1];var type1 = gameAssetTypes[index];for (var typeIndex in settings.assetTypes) {var type2 = settings.assetTypes[typeIndex];if (type1 == type2) {settings.rawAssets.assets[uuidKey][1] = parseInt(typeIndex);}}}} // 調(diào)整資源配置for (var assetkey in baseSetting.packedAssets) {settings.packedAssets[assetkey] = baseSetting.packedAssets[assetkey];}//動(dòng)態(tài)資源合并for (var uuidKey in baseSetting.rawAssets.assets) { settings.rawAssets.assets[uuidKey] = baseSetting.rawAssets.assets[uuidKey];}//場(chǎng)景合并for (var sceneKey in baseSetting.scenes) {if (settings.scenes.indexOf(baseSetting.scenes[sceneKey]) == -1){settings.scenes.push(baseSetting.scenes[sceneKey]);} }// uuid合并for (var uuidKey in baseSetting.uuids) {if (settings.uuids.indexOf(baseSetting.uuids[uuidKey]) == -1) {settings.uuids.push(baseSetting.uuids[uuidKey])}}上述代碼是在論壇網(wǎng)友提供的demo基礎(chǔ)上進(jìn)行了部分調(diào)整,核心的邏輯還是一致的:主要就是讀取對(duì)應(yīng)子游戲的setting文件,然后合并到大廳的setting中,建立好子游戲資源的uuid對(duì)應(yīng)關(guān)系,主要就能在游戲中引入對(duì)應(yīng)的游戲資源。
論壇網(wǎng)友提供的demo中,從子游戲回到大廳,需要再引入一份獨(dú)立的js文件。但是我的理解是,在啟動(dòng)大廳的時(shí)候已經(jīng)將大廳的setting加入到內(nèi)存中了,資源和uuid的對(duì)應(yīng)關(guān)系已經(jīng)建立,這個(gè)時(shí)候其實(shí)已經(jīng)沒有必要再重復(fù)引入一次大廳的setting配置,再來合并。實(shí)際項(xiàng)目上,我也是按照我的理解,沒有再單獨(dú)的引入js文件實(shí)現(xiàn)從子游戲回到大廳,目前也暫時(shí)沒有碰到問題。
另外,因?yàn)樗悸飞鲜谴髲d和子游戲要分開打包,在開發(fā)的過程中我們是可以大廳+子游戲一起開發(fā)。但是要注意的是,子游戲不能直接在編輯器中引用大廳的資源,比如子游戲的某個(gè)腳本是繼承自大廳的,,如:
cc.Class({extends: bg.GameModel,... })GamModel是大廳工程的代碼,在開發(fā)的過程中,因?yàn)樽佑螒蚝痛髲d在一個(gè)工程,這樣直接使用是沒有問題的。如果將子游戲單獨(dú)打包,在構(gòu)建的過程中會(huì)報(bào)錯(cuò),不過還是能構(gòu)建成功,但是在運(yùn)行的時(shí)候這個(gè)腳本組件就不會(huì)綁定到對(duì)應(yīng)的節(jié)點(diǎn)上去,所以應(yīng)該調(diào)整一下:
cc.Class({extends: window.bg == undefined ? cc.Component : bg.GameModel,... )}這樣構(gòu)建的過程中不會(huì)報(bào)錯(cuò),腳本組件能正常的綁定到對(duì)應(yīng)的節(jié)點(diǎn)上去。運(yùn)行過程中因?yàn)橐呀?jīng)加載了大廳的代碼,所以這個(gè)三目運(yùn)算的結(jié)果是取后面的bg.GameModel。
實(shí)現(xiàn)環(huán)境:Cocos Creator 2.0.9 版本。之前使用2.10版本,同樣的代碼構(gòu)建的工程,在win32模擬器上就會(huì)一直報(bào)錯(cuò),自帶模擬器對(duì)應(yīng)的src目錄下的modular.js會(huì)出現(xiàn)錯(cuò)誤,后來換成2.0.9版本,自編譯win32工程,再用模擬器運(yùn)行就沒有問題了。在安卓和ios上到是都正常的。
總結(jié)
以上是生活随笔為你收集整理的Cocos Creator 实现大厅+子游戏模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn机器学习之分类预测算法应用
- 下一篇: c语言密文解密程序,请问有学长做过这个程