【115@365】三国杀开源系列之七-game.js解读之lib.init.init

      通过上期的解读,我们发现,程序的疑似入口可能是有5万多行代码的game.js(因为自动加载的程序里,update.js、config.js、package.js都只有一个全局环境变量,所以排除掉),而这个js文件,只有一个函数,6个变量,在程序的最后调用了lib.init.init(),方法,所以,本期重点讲解这个方法,这个方法,有1431行,内容太多源码就不贴了,只贴个截图吧。

   

      1、下面开始逐段阶段,第一段,根据游戏运行目录路径,对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当前目录的绝对路径是不是string型,并且长度大于0,如果是,则以'/'为分隔符进行分割,然后循环取分割后的各数组的第一个字母,如果是a~z或者A~Z,则在lib.configprefix中赋上该值,如果不是26个英文字母,则赋值为下划线,这个的用处是区别同一台电脑,多个游戏版本用的,后面会讲到。不过在windows下运行,如果是在nodejs环境中运行,可以取到盘符,例如(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、第二段,设置重置游戏的超时时间,并清除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就会不一样,见上面解析,这样就可以分别进行设置。

        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、第四段,设置联机游戏的地址,如果没有配置过,则设置为默认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、第五段,设置游戏的背景图片

				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个大的复杂参数,直接当成了lib的子变量。(这里有可能会是坑,很多初始化的工作,有可能直接在这几个复杂的子变量里执行了,这样有可能还是会掩盖程序的真正入口。先慢慢分析这看吧。)

				lib.get=get;
				lib.ui=ui;
				lib.ai=ai;
				lib.game=game;

        7、接下来好大一段,分别是“HTMLDivElement.prototype”和“Array.prototype”开头的一堆函数,是为了给所有的div对象以及array对象增加一些自定义的属性。比如HTMLDivElement.prototype.animate是增加动画的,HTMLDivElement.prototype.hide设置隐藏等。

        8、接下来,window.onkeydown,设置一些快捷键。(暂时不解读,需要改的时候再看)

        9、接下来,window.onload,如果用的是非windows设备,即lib.device有值,则把cordova.js加进去。(cordova.js是css+html+js的又一个跨平台的框架,跟electron很像)。

        10、接下来,window.onerror,捕获错误信息的方法。包括报错的event事件、报错的步骤step,打印报错的信息等。

        11、接下来,如果有更新,window.noname_update为真,则进行更新。(暂时不解读,需要的时候再看)

      (今天先到这儿吧,有点儿头疼。回家了先)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值