【115@365】三国杀开源系列之七-game.js解读之lib.init.init
? ? ? 通過上期的解讀,我們發(fā)現(xiàn),程序的疑似入口可能是有5萬多行代碼的game.js(因為自動加載的程序里,update.js、config.js、package.js都只有一個全局環(huán)境變量,所以排除掉),而這個js文件,只有一個函數(shù),6個變量,在程序的最后調(diào)用了lib.init.init(),方法,所以,本期重點講解這個方法,這個方法,有1431行,內(nèi)容太多源碼就不貼了,只貼個截圖吧。
? ?
? ? ? 1、下面開始逐段階段,第一段,根據(jù)游戲運行目錄路徑,對lib.configprefix進行賦值
if(typeof __dirname==='string'&&__dirname.length){var dirsplit=__dirname.split('/');for(var i=0;i<dirsplit.length;i++){if(dirsplit[i]){var c=dirsplit[i][0];lib.configprefix+=/[A-Z]|[a-z]/.test(c)?c:'_';}}lib.configprefix+='_';}? ? ? ? 判斷__dirname當(dāng)前目錄的絕對路徑是不是string型,并且長度大于0,如果是,則以'/'為分隔符進行分割,然后循環(huán)取分割后的各數(shù)組的第一個字母,如果是a~z或者A~Z,則在lib.configprefix中賦上該值,如果不是26個英文字母,則賦值為下劃線,這個的用處是區(qū)別同一臺電腦,多個游戲版本用的,后面會講到。不過在windows下運行,如果是在nodejs環(huán)境中運行,可以取到盤符,例如(d:\game\noname)由于分割是“/”而不是“\”,所以只能取到d,那么lib.configprefix=noname_0.9_d_;如果在瀏覽器中運行,__dirname未定義,所以是空,lib.configprefix保持初始化不變,仍然是noname_0.9_。如果把這段改改,把spilt('/')改為split('\\'),則最終會變成lib.configprefix=noname_0.9_dgn_
? ? ? ?2、第二段,設(shè)置重置游戲的超時時間,并清除cordovalLoadTimeout(不明所以)
window.resetGameTimeout=setTimeout(lib.init.reset,parseInt(localStorage.getItem(lib.configprefix+'loadtime'))||5000); if(window.cordovaLoadTimeout){clearTimeout(window.cordovaLoadTimeout);delete window.cordovaLoadTimeout;}? ? ? ? 如果那noname多個版本放到不同路徑,lib.configprefix就會不一樣,見上面解析,這樣就可以分別進行設(shè)置。
? ? ? ? 3、第三段,移除第一個連接為app/color.css的link(不明所以)
var links=document.head.querySelectorAll('link');for(var i=0;i<links.length;i++){if(links[i].href.indexOf('app/color.css')!=-1){links[i].remove();break;}}? ? ? ? 4、第四段,設(shè)置聯(lián)機游戲的地址,如果沒有配置過,則設(shè)置為默認(rèn)lib.hallURL=noname.mobi
var index=window.location.href.indexOf('index.html?server=');if(index!=-1){window.isNonameServer=window.location.href.slice(index+18);window.nodb=true;}else{index=localStorage.getItem(lib.configprefix+'asserver');if(index){window.isNonameServer=index;window.isNonameServerIp=lib.hallURL;}}? ? ? 5、第五段,設(shè)置游戲的背景圖片
var htmlbg=localStorage.getItem(lib.configprefix+'background');if(htmlbg){if(htmlbg[0]=='['){try{htmlbg=JSON.parse(htmlbg);htmlbg=htmlbg[get.rand(htmlbg.length)];if(htmlbg.indexOf('custom_')==0){throw('err');}_status.htmlbg=htmlbg;}catch(e){htmlbg=null;}}if(htmlbg){document.documentElement.style.backgroundImage='url("'+lib.assetURL+'image/background/'+htmlbg+'.jpg")';document.documentElement.style.backgroundSize='cover';document.documentElement.style.backgroundPosition='50% 50%';}}? ? ? ? 6、第六段,給lib中的幾個變量賦值,這個賦值很厲害了,直接把另外4個大的復(fù)雜參數(shù),直接當(dāng)成了lib的子變量。(這里有可能會是坑,很多初始化的工作,有可能直接在這幾個復(fù)雜的子變量里執(zhí)行了,這樣有可能還是會掩蓋程序的真正入口。先慢慢分析這看吧。)
lib.get=get;lib.ui=ui;lib.ai=ai;lib.game=game;? ? ? ? 7、接下來好大一段,分別是“HTMLDivElement.prototype”和“Array.prototype”開頭的一堆函數(shù),是為了給所有的div對象以及array對象增加一些自定義的屬性。比如HTMLDivElement.prototype.animate是增加動畫的,HTMLDivElement.prototype.hide設(shè)置隱藏等。
? ? ? ? 8、接下來,window.onkeydown,設(shè)置一些快捷鍵。(暫時不解讀,需要改的時候再看)
? ? ? ? 9、接下來,window.onload,如果用的是非windows設(shè)備,即lib.device有值,則把cordova.js加進去。(cordova.js是css+html+js的又一個跨平臺的框架,跟electron很像)。
? ? ? ? 10、接下來,window.onerror,捕獲錯誤信息的方法。包括報錯的event事件、報錯的步驟step,打印報錯的信息等。
? ? ? ? 11、接下來,如果有更新,window.noname_update為真,則進行更新。(暫時不解讀,需要的時候再看)
? ? ? (今天先到這兒吧,有點兒頭疼。回家了先)
總結(jié)
以上是生活随笔為你收集整理的【115@365】三国杀开源系列之七-game.js解读之lib.init.init的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度强化学习入门
- 下一篇: 【opencv450-samples】f