日期:2014-05-16  浏览次数:20444 次

js1k2014年作品不完整还原-Wolfenstein

js1k.com是全球性的JavaScript比赛。

其要求是整个程序(JavaScript)部分必须在1024字节内,即我们需要用1024个英文单词(包含符号)来完成整个程序。

哇,听起来就好有难度的有木有!好刺激啊!


在我们解析前呢,先来了解一些JavaScript的压缩方法。

1.把长的变量及函数名改为1个字母或2个字母的简易名称。

2.系统函数保存为一个短名称变量。

3.删除空格、不必要的分号及其他符号。

4.采用压缩算法。



我们来看看本章的主角吧!

Wolfenstein

作者对此作品的简介: 2K的德军总部2D演示。您可以使用方向键来行走。该演示展现了如何用程序来生成纹理及地图,还有碰撞检测和门的动画。

东西挺多的嘛~(哎!?不对!!!2K?唔~我想起来了,js1k今年认为放大一倍大小限制可能会有更多优秀作品来的)


哇哦,是不是很酷!


我们来看看作者"Reinder Nijhoff"提供的源代码吧!

for(_='&&Cn[@-t$=[#h,`2,_-1^),Z,57,_._^]ZYImageData(X],WW[Vh=UI(T)*n+(eS++)R)ZQ=function(e,t,n){returnPP A[e.which]=O[f,oVN(N3_30W4737096=0;for(var ;s25664*(Math.abs(,D(min(vZmQ);if(s==[s])},0,.516random())/@4])[1][0]	n-F(e	$	,e$)),@l++]=B(>s;sR&255(A[h+2]-A[h])*qM(M(2928815,.9+.*sin((3+o/)/(f/80^.3)^/4QQ,E([(v-m)*y,(m+v)*yVe=a.widt`t=a.height,n=(k=c.createXe,t)).data,r#Wi#WA#WK#36,36Wu=L=1,BP(t>>S>>)1-n)<<|(t*S*)1-n)*|(tS)1-nI=onkeydownO1,1>e?e>0?e:0:1},D=onkeyupOTn-e+1)*Te$+1EP D(e	,t	,n	)*D(e,t,nFP sqrt(e*e+t*tGP T4JP T1^*MP e,e,2*T+*@5]@6]T(t	-n	-T(@2]$	)-@6]T(t-n-T(@3]$))QE(t,n,[@2W@3]])qP e,e,1+.2t	$)/F(3$	,3$QG(t,[3,3W1.)setInterval(function(){q=-u+(u=new Date//2ZU37,L+=,h++,ci=sin(LZco=cos(L)2K-=i[K	-(1-s)*ci*|(K-s*co*)<<8]>1?0:(ci-s*ci+s*co)*;o#Wae>a;aR{f=2*a/e^,f#f*co/4+ci/4,co/4-f*ci/4Wl=255,UF(f	,fZd2>d;dR{var v=f[dWm=K[d]-~~K[dWg=1/v;0<v?m=1-m:g=-g;y=g*m,s2o=K+f*y;for(0>vCo[d]--;y<l;){if((H=i[o	|o<<8])>1){s3i[o	|o^+s<<8]==1CdC(H=4);l=y,p=(o	+o)&63)+*d+128*H)}H==1C(w=F(x=(o	-K	+)/f	*f,o	-K	+)/h)Cw<lC(j=x-T3-F(o	-K	,o-K))+K-~~o)>0C(l=w,p=*j|0+128))2o+=f*g;y+=g}}var b=l/e,f=$*b/_l=4*a,d=4*e-4tM=1<f)?0>f?3684408:73688:r[321+f)|0+pWf+=bM>>M>>8M255,l+=d}c.putXk,032)*A=x=s,y=s>>8,l=.9<?3:_i=xCy?x%8?.7<C4!=y%8?l:0:4==y%8?1:l:l6b2>b;bRo>o;oRf>f;fR{l=o+1&15,p=f+1+(o+1>>4<<4)&31,U125006759873,l/+.1*);if(2>p||2>l)U;v=f-3_m=o-3UM(`[p,lV1,1,31,15,_.3_1]3)p#13,min(9-pow(5f/-Z2Z9)Wl=sin(.4*f+2.7Zd#51,55+lWy=->v?-.7:.7,U``.2ZE([f-_o-2Wp,dQ328987,777215_4Q3,3Q777215,G12QJ11QJ9^,^V1,4]-4._4.2V1,6.]^,^V4,1]4._^V6.,4.2]Q.8+.2*lZE([f,oWp,d)4)l#32-vZoWUl,[^,^,28,,_.4,^]Zl,[6,6,23YE(N29,0V35,]QUq(`[l	%2_l%28]Z`E(l,[6,6V24,57])1)UN^,,66,_.4,^]ZN6,6,57YUq(`[f%8,o%8]Z`E(N6,6V57,57]));r[*f+o+*b+2*s)]=`b/3)}';g=/[-N-Z^-`#$@C]/.exec(_);)with(_.split(g))_=join(shift());eval(_)
Oh my god! 这是什么鬼东西!?

别着急……我们来慢慢分析一下……


由于Js1k比赛中已经提供了一些内置内容。

我们先来看看比赛中都提供了哪些内容呢:

<!-- 哦,我们需要的是一个全屏应用程序,吼吼 -->
<style>
      html, body { margin: 0; padding: 0; border: 0; width: 100%; height: 100%; overflow:hidden;}
      #c { display: block; } /* kill scrollbars from hell */
</style>

<!-- 嗯,提供了一个名为c的画布 -->
<canvas id="c"></canvas>

<!-- 哇哦,No bad!好多兼容代码呢。 -->
<script>
    var a = document.getElementsByTagName('canvas')[0];
    var b = document.body;
    var d = function (e) { return function () { e.parentNode.removeChild(e); }; }(a);
    // unprefix some popular vendor prefixed things