[解读]html5游戏app_Sinuous

来源:互联网 发布:梦想小镇mac修改器 编辑:程序博客网 时间:2024/06/05 03:31

用到的东西

1. canvas

2. js

---

效果图

PC:

Mobile

---

解读

源码:

SinuousWorld=new function(){function j(){if(n==false){playSound("MusicCalmARR");n=true;o=[];w=[];h=0;r=1;A=I=J=K=0;c.trail=[];c.position.x=y;c.position.y=z;c.shield=0;s.style.display="none";q.style.display="block";B.style.display="none";C=(new Date).getTime()}}function t(){playSound("MusicIdleARR");playSound("fx_explosion");n=false;Q=(new Date).getTime()-C;Z();s.style.display="block";h=Math.round(h);R.innerHTML="Game Over! ("+h+" points)";scoreText="Score: <span>"+Math.round(h)+"</span>";scoreText+=" Time: <span>"+Math.round(((new Date).getTime()-C)/1E3*100)/100+"s</span>";q.innerHTML=scoreText}function $(){for(var a=g.length<10,b=0;b<g.length;b++)if(h>g[b].score){a=true;break}if(a)if(!D.value||D.value==" ")alert("Name can not be empty.");else{aa();B.style.display="none"}}function Z(){ajax.ghs(function(a){if((g=eval(a))&&n==false){a=1;for(var b=0;b<g.length;b++)g[b].score>h&&a++;if(a<10){if(g.length>1)if(b=g.length>=9?g.pop():{}){b.name="";b.score=Math.round(h);b.date="";newHighscoreData=g.slice(0,a-1);newHighscoreData.push(b);g=newHighscoreData=newHighscoreData.concat(g.slice(a-1));L()}S.innerHTML="You made #"+a+" on the top list!";B.style.display="block"}}})}function ba(){ajax.ghs(function(a){g=eval(a);L()})}function aa(){var a=D.value;ajax.shs(function(b){g=eval(b);L()},"n="+a+"&s="+h*h*3.14159265*Math.max(a.length,1)+"&d="+Math.round(Q/1E3*100)/100+"&sc="+sc+"&fc="+Math.round(K)+"&fs="+Math.round(J)+"&ms="+Math.round(I)+"&cs="+Math.round(A)+"&f="+Math.round((M+N+u)/3))}function L(){if(g){for(var a="",b=0;b<g.length;b++){a+="<li>";a+='<span class="place">'+(b+1)+".</span>";a+='<span class="name">'+g[b].name+"</span>";a+='<span class="score">'+g[b].score+" p</span>";a+='<span class="date">'+g[b].date+"</span>";a+="</li>"}T.innerHTML=a}}function ca(a){y=a.clientX-(window.innerWidth-m)*0.5-6;z=a.clientY-(window.innerHeight-l)*0.5-6}function da(){}function ea(){}function fa(a){if(a.touches.length==1){a.preventDefault();y=a.touches[0].pageX-(window.innerWidth-m)*0.5;z=a.touches[0].pageY-(window.innerHeight-l)*0.5}}function ga(a){if(a.touches.length==1){a.preventDefault();y=a.touches[0].pageX-(window.innerWidth-m)*0.5-60;z=a.touches[0].pageY-(window.innerHeight-l)*0.5-30}}function ha(){}function U(){m=v?window.innerWidth:900;l=v?window.innerHeight:550;k.width=m;k.height=l;var a=(window.innerWidth-m)*0.5,b=(window.innerHeight-l)*0.5;k.style.position="absolute";k.style.left=a+"px";k.style.top=b+"px";if(v){s.style.left="0px";s.style.top="0px";q.style.left="0px";q.style.top="0px"}else{s.style.left=a+6+"px";s.style.top=b+200+"px";q.style.left=a+6+"px";q.style.top=b+6+"px"}E.style.position="absolute";E.style.left=a+"px";E.style.top=b-20+"px"}function F(a,b){for(var d=10+Math.random()*15;--d>=0;){var i=new Point;i.position.x=a.x+Math.sin(d)*b;i.position.y=a.y+Math.cos(d)*b;i.velocity={x:-4+Math.random()*8,y:-4+Math.random()*8};i.alpha=1;G.push(i)}}function V(){var a=(new Date).getTime();O++;if(a>P+1E3){u=Math.min(Math.round(O*1E3/(a-P)),x);M=Math.min(M,u);N=Math.max(N,u);P=a;O=0}a=0.01+Math.max(Math.min(u,x),0)/x*0.99;a*=a;f.clearRect(0,0,k.width,k.height);var b={x:H.x*r,y:H.y*r},d,i;if(n){r+=8.0E-4;pp=c.clonePosition();c.position.x+=(y-c.position.x)*0.14;c.position.y+=(z-c.position.y)*0.14;h+=0.4*r*a;h+=c.distanceTo(pp)*0.1*a;K++;J+=0.4*r*a;I+=c.distanceTo(pp)*0.1*a;c.shield=Math.max(c.shield-1,0);if(c.shield>0&&(c.shield>100||c.shield%3!=0)){f.beginPath();f.fillStyle="#167a66";f.strokeStyle="#00ffcc";f.arc(c.position.x,c.position.y,c.size*(Math.min(c.shield,100)/50),0,Math.PI*2,true);f.fill();f.stroke()}c.trail.push(new Point(c.position.x,c.position.y));f.beginPath();f.strokeStyle="#648d93";f.lineWidth=2;d=0;for(i=c.trail.length;d<i;d++){p=c.trail[d];p2=c.trail[d+1];if(d==0)f.moveTo(p.position.x,p.position.y);else p2&&f.quadraticCurveTo(p.position.x,p.position.y,p.position.x+(p2.position.x-p.position.x)/2,p.position.y+(p2.position.y-p.position.y)/2);p.position.x+=b.x;p.position.y+=b.y}f.stroke();f.closePath();c.trail.length>60&&c.trail.shift();f.beginPath();f.fillStyle="#8ff1ff";f.arc(c.position.x,c.position.y,c.size/2,0,Math.PI*2,true);f.fill()}if(n&&(c.position.x<0||c.position.x>m||c.position.y<0||c.position.y>l)){F(c.position,10);t()}for(d=0;d<o.length;d++){p=o[d];if(n)if(c.shield>0&&p.distanceTo(c.position)<(c.size*4+p.size)*0.5){playSound("fx_break");F(p.position,10);o.splice(d,1);d--;h+=10*a;A+=10*a;continue}else if(p.distanceTo(c.position)<(c.size+p.size)*0.5){F(c.position,10);t()}f.beginPath();f.fillStyle="#ff0000";f.arc(p.position.x,p.position.y,p.size/2,0,Math.PI*2,true);f.fill();p.position.x+=b.x*p.force;p.position.y+=b.y*p.force;if(p.position.x<-p.size||p.position.y>l+p.size){o.splice(d,1);d--}}for(d=0;d<w.length;d++){p=w[d];if(p.distanceTo(c.position)<(c.size+p.size)*0.5&&n){playSound("MusicFunARR");playSound("fx_bubble");c.shield=300;for(i=0;i<o.length;i++){e=o[i];if(e.distanceTo(p.position)<100){playSound("fx_break");F(e.position,10);o.splice(i,1);i--;h+=10*a;A+=10*a}}}f.beginPath();f.fillStyle="#00ffcc";f.arc(p.position.x,p.position.y,p.size/2,0,Math.PI*2,true);f.fill();p.position.x+=b.x*p.force;p.position.y+=b.y*p.force;if(p.position.x<-p.size||p.position.y>l+p.size||c.shield!=0){w.splice(d,1);d--}}o.length<35*r&&o.push(W(new Enemy));w.length<1&&Math.random()>0.997&&c.shield==0&&w.push(W(new Shield));c.shield==1&&n&&playSound("MusicCalmARR");for(d=0;d<G.length;d++){p=G[d];p.velocity.x+=(b.x-p.velocity.x)*0.04;p.velocity.y+=(b.y-p.velocity.y)*0.04;p.position.x+=p.velocity.x;p.position.y+=p.velocity.y;p.alpha-=0.02;f.fillStyle="rgba(255,255,255,"+Math.max(p.alpha,0)+")";f.fillRect(p.position.x,p.position.y,1,1);p.alpha<=0&&G.splice(d,1)}if(n){scoreText="Score: <span>"+Math.round(h)+"</span>";scoreText+=" Time: <span>"+Math.round(((new Date).getTime()-C)/1E3*100)/100+"s</span>";scoreText+=' <p class="fps">FPS: <span>'+Math.round(u)+" ("+Math.round(Math.max(Math.min(u/x,x),0)*100)+"%)</span></p>";q.innerHTML=scoreText}}function W(a){if(Math.random()>0.5){a.position.x=Math.random()*m;a.position.y=-20}else{a.position.x=m+20;a.position.y=-l*0.2+Math.random()*l*1.2}return a}var v=navigator.userAgent.toLowerCase().indexOf("android")!=-1||navigator.userAgent.toLowerCase().indexOf("iphone")!=-1||navigator.userAgent.toLowerCase().indexOf("ipad")!=-1,m=v?window.innerWidth:900,l=v?window.innerHeight:550,x=60,k,f,q,s,R,X,E,o=[],w=[],G=[],c,y=window.innerWidth-m,z=window.innerHeight-l,n=false,h=0,C=0,Q=0,r=1,K=0,J=0,I=0,A=0,H={x:-1.3,y:1},u=0,M=1E3,N=0,P=(new Date).getTime(),O=0,g=[],T,B,D,Y,S;this.init=function(){k=document.getElementById("world");s=document.getElementById("panels");q=document.getElementById("status");document.getElementById("message");R=document.getElementById("title");X=document.getElementById("startButton");E=document.getElementById("seeMore");document.getElementById("highscoreList");T=document.getElementById("highscoreOutput");B=document.getElementById("highscoreWin");D=document.getElementById("highscoreInput");Y=document.getElementById("highscoreSubmit");S=document.getElementById("highscorePlace");if(k&&k.getContext){f=k.getContext("2d");document.addEventListener("mousemove",ca,false);document.addEventListener("mousedown",da,false);document.addEventListener("mouseup",ea,false);k.addEventListener("touchstart",fa,false);document.addEventListener("touchmove",ga,false);document.addEventListener("touchend",ha,false);window.addEventListener("resize",U,false);X.addEventListener("click",j,false);Y.addEventListener("click",$,false);c=new Player;U();if(v){document.getElementById("sharing").style.display="none";document.getElementById("panel").style.display="none";q.style.width=m+"px";k.style.border="none";H.x*=2;H.y*=2;setInterval(V,1E3/30)}else setInterval(V,1E3/x);ba();v||swfobject.embedSWF("swf/sound.swf","sound","1","1","9.0.0","",{},{allowScriptAccess:"always"},{id:"soundSWF"})}};ajax={ghs:function(a){var b=new XMLHttpRequest;parameters="m=ghs";b.open("POST","highscore.php",true);b.setRequestHeader("Content-type","application/x-www-form-urlencoded");if(b){b.onreadystatechange=function(){b.readyState==4&&b.status==200&&a(b.responseText)};b.send(parameters)}},shs:function(a,b){var d=new XMLHttpRequest;b+="&m=shs";if(d){d.open("POST","highscore.php",true);d.setRequestHeader("Content-type","application/x-www-form-urlencoded");d.onreadystatechange=function(){d.readyState==4&&d.status==200&&a(d.responseText)};d.send(b)}}}};function Point(j,t){this.position={x:j,y:t}}Point.prototype.distanceTo=function(j){var t=j.x-this.position.x;j=j.y-this.position.y;return Math.sqrt(t*t+j*j)};Point.prototype.clonePosition=function(){return{x:this.position.x,y:this.position.y}};function Player(){this.position={x:0,y:0};this.trail=[];this.size=8;this.shield=0}Player.prototype=new Point;function Enemy(){this.position={x:0,y:0};this.size=6+Math.random()*4;this.force=1+Math.random()*0.4}Enemy.prototype=new Point;function Shield(){this.position={x:0,y:0};this.size=10+Math.random()*8;this.force=1+Math.random()*0.4}Shield.prototype=new Point;SinuousWorld.init();function sendToJavaScript(j){j=="SoundController ready and loaded!"&&playSound("MusicIdleARR")}function playSound(j){navigator.userAgent.toLowerCase().indexOf("android")!=-1||navigator.userAgent.toLowerCase().indexOf("iphone")!=-1||navigator.userAgent.toLowerCase().indexOf("ipad")!=-1||document.getElementById("soundSWF").sendToActionScript(j)};
View Code

代码分析:

  1 /*  2 Object List:  3 1. SinuousWorld: main Object, the whole game world  4 2. Point: father Object, subObjects are [Player],[Enemy],[Shield]  5 3. Player: implements Point  6 4. Enemy: implements Point  7 5. Shield: implements Point  8 -----  9 Global Function List: 10 1. *playSound(j): maybe used to judge the webbrowser and play the sound used in mobile [but why not use tag audio?] (call sendToJavaScript) 11 2. *sendToJavaScript(j): deal with sound 12 3. ajax: used to get the data about highScore 13 ----- 14 detail of Object: 15 -- 16 Point(j,t): 17     Vars: 18         position{x=j,y=t} 19     Function: 20         Point(j,t) [j=x,t=y] 21         distanceTo(j) [j={x=..,y=..}] 22         clonePosition [return {x=..,y=..}] 23 -- 24 Player: 25     Var: 26         position(x=0,y=0) 27         trail[] (array) 28         size (int) 29         shield (flag[0,1]) 30     Function: 31         Player(j,t) [j=x,t=y] 32         distanceTo(j) [j={x=..,y=..}] 33         clonePosition [return {x=..,y=..}] 34 -- 35 Enemy: 36     Var: 37         position(x=0,y=0) 38         size (int)[random] 39         force (int)[>=1] (=speed?) 40     Function: 41         Player(j,t) [j=x,t=y] 42         distanceTo(j) [j={x=..,y=..}] 43         clonePosition [return {x=..,y=..}] 44 -- 45 Shield(保护罩) 46     Var: 47         position(x=0,y=0) 48         size (int)[random] 49         force (int)[>=1] (=time?) 50     Function: 51         Player(j,t) [j=x,t=y] 52         distanceTo(j) [j={x=..,y=..}] 53         clonePosition [return {x=..,y=..}] 54 -- 55 SinuousWorld(游戏世界) 56     Var: 57         v: if is mobile [True] else [False] (=isMobile), 58         m: if is moblie [fullScreen width] else [900] (=world width), 59         l: if is moblie [fullScreen height] else [500] (=world height), 60         x = 60, 61         k = document.getElementById("world") [# canvas #], 62         f = canvas.getContext("2d") [used to control canvas], 63         q = document.getElementById("status"), 64         s = document.getElementById("panels"), 65         R = document.getElementById("title"), 66         X = document.getElementById("startButton"), 67         E = document.getElementById("seeMore"), 68         o = [], 69         w = [], 70         G = [] (碰撞粒子), 71         c(new Player), 72         y: if is mobile [0] else [blank width] (=player's position left), 73         z: if is mobile [0] else [blank height] (=player's position top), 74         n = false, 75         h = 0 (=Score), 76         C = 0, 77         Q = 0, 78         r = 1, 79         K = 0, 80         J = 0, 81         I = 0, 82         A = 0, 83         H = { 84             x: -1.3, 85             y: 1 86         }, (方向向量,碰撞粒子有被向左下角吹去的效果) 87         u = 0 (=FPS), 88         M = 1E3, 89         N = 0, 90         P = (new Date).getTime() (=timer?), 91         O = 0, 92         g = [], 93         T = document.getElementById("highscoreOutput"), 94         B = document.getElementById("highscoreWin"), 95         D = document.getElementById("highscoreInput"), 96         Y = document.getElementById("highscoreSubmit"), 97         S = document.getElementById("highscorePlace"); 98     Function: 99         init: 100             1. initialize the Game World's vars,101             2. bind the event102                 1) doc mousemove -> ca103                 2) doc mousedown -> da104                 3) doc mouseup -> ea105                 4) canvas touchstart -> fa106                 5) doc touchmove -> ga107                 6) doc touchend -> ha108                 7) window resize -> U109                 8) X[startButton] click -> j110                 9) Y[highscoreSubmit] click -> $ (why you use the dollor singal.... )111             3. new Player112             4. call U() to resize the window;113             5. if is mobile114                 hide [sharing] and [panel]115                 set [status] fullscreen width116                 set [world] no border117                 H.x *= 2;118                 H.y *= 2;119                 setInterval(V, 1E3 / 30) [每秒30帧,执行V]120                esle121                 setInterval(V, 1E3 / x) [每秒60帧,执行V]122             6. call ba() [deal with score]123             7. dealwith sound [something with mobile and swf]124         U:125             resize126                 [world(width,height,left,top)],127                 [panels/status(left,top)],128                 [seeMore(left,top)]129         ba: dealwith highScore130         ca(a): [doc mousemove]131             y = a.clientX - (window.innerWidth - m) * 0.5 - 6 (=player's position left)132             z = a.clientY - (window.innerHeight - l) * 0.5 - 6 (=player's position top)133         da: [doc mousedown]134             empty135         ea: [doc mouseup]136             empty137         fa(a): [canvas touchstart]138             if (a.touches.length == 1) {139                 a.preventDefault();140                 y = a.touches[0].pageX - (window.innerWidth - m) * 0.5141                 z = a.touches[0].pageY - (window.innerHeight - l) * 0.5142             }143         ga(a): [doc touchmove]144             if (a.touches.length == 1) {145                 a.preventDefault();146                 y = a.touches[0].pageX - (window.innerWidth - m) * 0.5 - 60147                 z = a.touches[0].pageY - (window.innerHeight - l) * 0.5 - 30148             }149         ha: [doc touchend]150             empty151         $: deal with submit score and highscore152         j:153             if n == false(first time[initialzie vars when click to play])154                 1. play sound155                 2. init var156                     n = true157                     o = []158                     w = []159                     h = 0160                     r = 1161                     A,I,J,K = 0162                     c.trail = []163                     c.position.x = y;164                     c.position.y = z;165                     c.shield = 0166                     C =  startTime (now)167                     [panels] hide168                     [status] show169                     [highscoreWin] hide170         V: ***Main function***171             0. get now time to Var a172             1. O = 0, ++; count the call times (used to calcute the FPS)173             2. per second update the FPS and set MaxFPS -> N, MinFPS -> M174             3. calculate a......175             4. clear canvas176             5. if is playing177                 r += 8.0E-4; (init = 1)178                 // 记录当前Player位置179                 pp = c.clonePosition();180                 // 延迟移动181                 c.position.x += (y - c.position.x) * 0.14;182                 c.position.y += (z - c.position.y) * 0.14;183                 h += 0.4 * r * a;184                 h += c.distanceTo(pp) * 0.1 * a;185                 K++;186                 J += 0.4 * r * a;187                 I += c.distanceTo(pp) * 0.1 * a;188                 // 保护罩189                 c.shield = Math.max(c.shield - 1, 0);190                 if (c.shield > 0 && (c.shield > 100 || c.shield % 3 != 0)) {191                     f.beginPath();192                     f.fillStyle = "#167a66";193                     f.strokeStyle = "#00ffcc";194                     f.arc(c.position.x, c.position.y, c.size * (Math.min(c.shield, 100) / 50), 0, Math.PI * 2, true);195                     f.fill();196                     f.stroke()197                 }198                 // 尾巴199                 c.trail.push(new Point(c.position.x, c.position.y));200                 f.beginPath();201                 f.strokeStyle = "#648d93";202                 f.lineWidth = 2;203                 d = 0;204                 for (i = c.trail.length; d < i; d++) {205                     p = c.trail[d];206                     p2 = c.trail[d + 1];207                     if (d == 0) f.moveTo(p.position.x, p.position.y);208                     // 二次贝塞尔曲线209                     else p2 && f.quadraticCurveTo(p.position.x, p.position.y, p.position.x + (p2.position.x - p.position.x) / 2, p.position.y + (p2.position.y - p.position.y) / 2);210                     p.position.x += b.x;211                     p.position.y += b.y212                 }213                 f.stroke();214                 f.closePath();215                 c.trail.length > 60 && c.trail.shift();216                 // draw Player217                 f.beginPath();218                 f.fillStyle = "#8ff1ff";219                 f.arc(c.position.x, c.position.y, c.size / 2, 0, Math.PI * 2, true);220                 f.fill()221             6. 222                 // 如果Player超出可见范围223                 if (n && (c.position.x < 0 || c.position.x > m || c.position.y < 0 || c.position.y > l)) {224                     // 发生碰撞225                     F(c.position, 10);226                     // game over227                     t()228                 }229             7.230                 // draw Enemy231                 for (d = 0; d < o.length; d++) {232                     p = o[d];233                     if (n) if (c.shield > 0 && p.distanceTo(c.position) < (c.size * 4 + p.size) * 0.5) {234                         // crash to Player and Be killed235                         playSound("fx_break");236                         F(p.position, 10);237                         o.splice(d, 1);238                         d--;239                         h += 10 * a;240                         A += 10 * a;241                         continue242                     } else if (p.distanceTo(c.position) < (c.size + p.size) * 0.5) {243                         // crash to Player and Game Over244                         F(c.position, 10);245                         // game over246                         t()247                     }248                     // draw Enemy249                     f.beginPath();250                     f.fillStyle = "#ff0000";251                     f.arc(p.position.x, p.position.y, p.size / 2, 0, Math.PI * 2, true);252                     f.fill();253                     // move itself254                     p.position.x += b.x * p.force;255                     p.position.y += b.y * p.force;256                     // ??257                     if (p.position.x < -p.size || p.position.y > l + p.size) {258                         o.splice(d, 1);259                         d--260                     }261                 }262             8.263                 // draw 保护罩264                 for (d = 0; d < w.length; d++) {265                     p = w[d];266                     if (p.distanceTo(c.position) < (c.size + p.size) * 0.5 && n) {267                         // 吃到保护罩268                         playSound("MusicFunARR");269                         playSound("fx_bubble");270                         c.shield = 300;271                         for (i = 0; i < o.length; i++) {272                             // 马上消灭Enemy273                             e = o[i];274                             if (e.distanceTo(p.position) < 100) {275                                 playSound("fx_break");276                                 F(e.position, 10);277                                 o.splice(i, 1);278                                 i--;279                                 h += 10 * a;280                                 A += 10 * a281                             }282                         }283                     }284                     // draw 保护罩285                     f.beginPath();286                     f.fillStyle = "#00ffcc";287                     f.arc(p.position.x, p.position.y, p.size / 2, 0, Math.PI * 2, true);288                     f.fill();289                     // move 保护罩290                     p.position.x += b.x * p.force;291                     p.position.y += b.y * p.force;292                     if (p.position.x < -p.size || p.position.y > l + p.size || c.shield != 0) {293                         // 消除保护罩,Player 无法吃多个保护罩294                         w.splice(d, 1);295                         d--296                     }297                 }298             9.299                 // 生成 enemy300                 o.length < 35 * r && o.push(W(new Enemy));301                 // 生成 保护罩302                 w.length < 1 && Math.random() > 0.997 && c.shield == 0 && w.push(W(new Shield));303                 // 保护罩消失前提示304                 c.shield == 1 && n && playSound("MusicCalmARR");305             10.306                 // draw碰撞粒子307                 for (d = 0; d < G.length; d++) {308                     p = G[d];309                     p.velocity.x += (b.x - p.velocity.x) * 0.04;310                     p.velocity.y += (b.y - p.velocity.y) * 0.04;311                     p.position.x += p.velocity.x;312                     p.position.y += p.velocity.y;313                     p.alpha -= 0.02;314                     f.fillStyle = "rgba(255,255,255," + Math.max(p.alpha, 0) + ")";315                     f.fillRect(p.position.x, p.position.y, 1, 1);316                     p.alpha <= 0 && G.splice(d, 1)317                 }318             11.319                 // update the score and status320                 // also show the FPS(播放速度 帧/秒)321                 if (n) {322                     scoreText = "Score: <span>" + Math.round(h) + "</span>";323                     scoreText += " Time: <span>" + Math.round(((new Date).getTime() - C) / 1E3 * 100) / 100 + "s</span>";324                     scoreText += ' <p class="fps">FPS: <span>' + Math.round(u) + " (" + Math.round(Math.max(Math.min(u / x, x), 0) * 100) + "%)</span></p>";325                     q.innerHTML = scoreText326                 }327         W(a):328             随机Enemy's Position329 代码混淆后,识别还真不容易,还好这个代码写得简单易懂。 哈哈330 ------331 js拓展332 1.333     Array.splice()334     它可以用于插入、删除或替换数组的元素335         1)删除-用于删除元素,两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数)336         2)插入-向数组指定位置插入任意项元素。三个参数,第一个参数(其实位置),第二个参数(0),第三个参数(插入的项)337         3)替换-向数组指定位置插入任意项元素,同时删除任意数量的项,三个参数。第一个参数(起始位置),第二个参数(删除的项数),第三个参数(插入任意数量的项) 338 339 */

修改后的代码:(因为太懒,去掉了很多功能)

  1 /*  2 * 迷你无声单机版 (^◇^)  3 * 偷懒就不重命名 代码混乱后的代码了  4 * 也是偷懒,把声音去掉吧  5 * 索性再偷懒下,就只留一个canvas 和 分数 吧  6 */  7 SinuousWorld = new  8 function() {  9     function j() { 10         /*click start*/ 11         if (n == false) { 12             //playSound("MusicCalmARR"); 13             n = true; 14             o = []; 15             w = []; 16             h = 0; 17             r = 1; 18             A = I = J = K = 0; 19             c.trail = []; 20             c.position.x = y; 21             c.position.y = z; 22             c.shield = 0; 23             //s.style.display = "none"; 24             //q.style.display = "block"; 25             //B.style.display = "none"; 26             C = (new Date).getTime(); 27         } 28     } 29     /*game finish and show the score*/ 30     function t() { 31         //playSound("MusicIdleARR"); 32         //playSound("fx_explosion"); 33         n = false; // finish flag 34         Q = (new Date).getTime() - C; 35         //Z(); 36         //s.style.display = "block"; 37         h = Math.round(h); 38         //R.innerHTML = "Game Over! (" + h + " points)"; 39         //scoreText = "Score: <span>" + Math.round(h) + "</span>"; 40         //scoreText += " Time: <span>" + Math.round(((new Date).getTime() - C) / 1E3 * 100) / 100 + "s</span>"; 41         //q.innerHTML = scoreText 42         btn_ss.style.display = "inline"; 43     } 44     /*deal with score >delete*/ 45     /*function $() { 46         for (var a = g.length < 10, 47         b = 0; b < g.length; b++) if (h > g[b].score) { 48             a = true; 49             break 50         } 51         if (a) if (!D.value || D.value == " ") alert("Name can not be empty."); 52         else { 53             aa(); 54             B.style.display = "none" 55         } 56     }*/ 57     /*deal with score >delete*/ 58     /* 59     function Z() { 60         ajax.ghs(function(a) { 61             if ((g = eval(a)) && n == false) { 62                 a = 1; 63                 for (var b = 0; b < g.length; b++) g[b].score > h && a++; 64                 if (a < 10) { 65                     if (g.length > 1) if (b = g.length >= 9 ? g.pop() : {}) { 66                         b.name = ""; 67                         b.score = Math.round(h); 68                         b.date = ""; 69                         newHighscoreData = g.slice(0, a - 1); 70                         newHighscoreData.push(b); 71                         g = newHighscoreData = newHighscoreData.concat(g.slice(a - 1)); 72                         L() 73                     } 74                     S.innerHTML = "You made #" + a + " on the top list!"; 75                     B.style.display = "block" 76                 } 77             } 78         }) 79     }*/ 80     /*deal with score >delete*/ 81     /*function ba() { 82         ajax.ghs(function(a) { 83             g = eval(a); 84             L() 85         }) 86     }*/ 87     /*deal with score >delete*/ 88     /*function aa() { 89         var a = D.value; 90         ajax.shs(function(b) { 91             g = eval(b); 92             L() 93         }, 94         "n=" + a + "&s=" + h * h * 3.14159265 * Math.max(a.length, 1) + "&d=" + Math.round(Q / 1E3 * 100) / 100 + "&sc=" + sc + "&fc=" + Math.round(K) + "&fs=" + Math.round(J) + "&ms=" + Math.round(I) + "&cs=" + Math.round(A) + "&f=" + Math.round((M + N + u) / 3)) 95     }*/ 96     /*deal with score >delete*/ 97     /*function L() { 98         if (g) { 99             for (var a = "",100             b = 0; b < g.length; b++) {101                 a += "<li>";102                 a += '<span class="place">' + (b + 1) + ".</span>";103                 a += '<span class="name">' + g[b].name + "</span>";104                 a += '<span class="score">' + g[b].score + " p</span>";105                 a += '<span class="date">' + g[b].date + "</span>";106                 a += "</li>"107             }108             T.innerHTML = a109         }110     }*/111     /*[doc mousemove]*/112     function ca(a) {113         y = a.clientX - (window.innerWidth - m) * 0.5 - 6;114         z = a.clientY - (window.innerHeight - l) * 0.5 - 6115     }116     /*[doc mousedown]*/117     function da() {}118     /*[doc mouseup]*/119     function ea() {}120     /*[canvas touchstart]*/121     function fa(a) {122         if (a.touches.length == 1) {123             a.preventDefault();124             y = a.touches[0].pageX - (window.innerWidth - m) * 0.5;125             z = a.touches[0].pageY - (window.innerHeight - l) * 0.5126         }127     }128     /*[doc touchmove]*/129     function ga(a) {130         if (a.touches.length == 1) {131             a.preventDefault();132             y = a.touches[0].pageX - (window.innerWidth - m) * 0.5 - 60;133             z = a.touches[0].pageY - (window.innerHeight - l) * 0.5 - 30134         }135     }136     /*[doc touchend]*/137     function ha() {}138     /*add btn_ss_click*/139     function btn_ss_click(e){140         e.preventDefault();141         btn_ss.style.display = "none";142         n = false;143         j();144     }145     /*resize*/146     function U() {147         m = v ? window.innerWidth: 900;148         l = v ? window.innerHeight: 550;149         k.width = m;150         k.height = l;151         var a = (window.innerWidth - m) * 0.5,152         b = (window.innerHeight - l) * 0.5;153         k.style.position = "absolute";154         /*add 简单点,直接居中*/155         k.style.left = a + "px";156         k.style.top = b +"px";157         /* add start ,score */158         var btn_ss_l = (window.innerWidth - 100) * 0.5,159         btn_ss_l_t = (window.innerHeight - 50) * 0.5;160         btn_ss.style.position = "absolute";161         btn_ss.style.left = btn_ss_l + "px";162         btn_ss.style.top = btn_ss_l_t + "px";163         btn_p.style.width = m + "px";164         btn_p.style.position = "absolute";165         btn_p.style.left = a + "px";166         btn_p.style.top = b + ( v ? 0 : 6 ) + "px";167         /*k.style.left = a + "px";168         k.style.top = b + "px";169         if (v) {170             s.style.left = "0px";171             s.style.top = "0px";172             q.style.left = "0px";173             q.style.top = "0px"174         } else {175             s.style.left = a + 6 + "px";176             s.style.top = b + 200 + "px";177             q.style.left = a + 6 + "px";178             q.style.top = b + 6 + "px"179         }180         E.style.position = "absolute";181         E.style.left = a + "px";182         E.style.top = b - 20 + "px"*/183     }184     /*添加撞击粒子*/185     function F(a, b) {186         for (var d = 10 + Math.random() * 15; --d >= 0;) {187             var i = new Point;188             i.position.x = a.x + Math.sin(d) * b;189             i.position.y = a.y + Math.cos(d) * b;190             i.velocity = {191                 x: -4 + Math.random() * 8,192                 y: -4 + Math.random() * 8193             };194             i.alpha = 1;195             G.push(i)196         }197     }198     /*游戏动画*/199     function V() {200         var a = (new Date).getTime();201         O++;202         if (a > P + 1E3) {203             u = Math.min(Math.round(O * 1E3 / (a - P)), x);204             M = Math.min(M, u);205             N = Math.max(N, u);206             P = a;207             O = 0208         }209         a = 0.01 + Math.max(Math.min(u, x), 0) / x * 0.99;210         a *= a;211         f.clearRect(0, 0, k.width, k.height);212         var b = {213             x: H.x * r,214             y: H.y * r215         },216         d,217         i;218         if (n) {219             r += 8.0E-4;220             pp = c.clonePosition();221             c.position.x += (y - c.position.x) * 0.14;222             c.position.y += (z - c.position.y) * 0.14;223             h += 0.4 * r * a;224             h += c.distanceTo(pp) * 0.1 * a;225             K++;226             J += 0.4 * r * a;227             I += c.distanceTo(pp) * 0.1 * a;228             c.shield = Math.max(c.shield - 1, 0);229             if (c.shield > 0 && (c.shield > 100 || c.shield % 3 != 0)) {230                 f.beginPath();231                 f.fillStyle = "#167a66";232                 f.strokeStyle = "#00ffcc";233                 f.arc(c.position.x, c.position.y, c.size * (Math.min(c.shield, 100) / 50), 0, Math.PI * 2, true);234                 f.fill();235                 f.stroke()236             }237             c.trail.push(new Point(c.position.x, c.position.y));238             f.beginPath();239             f.strokeStyle = "#648d93";240             f.lineWidth = 2;241             d = 0;242             for (i = c.trail.length; d < i; d++) {243                 p = c.trail[d];244                 p2 = c.trail[d + 1];245                 if (d == 0) f.moveTo(p.position.x, p.position.y);246                 else p2 && f.quadraticCurveTo(p.position.x, p.position.y, p.position.x + (p2.position.x - p.position.x) / 2, p.position.y + (p2.position.y - p.position.y) / 2);247                 p.position.x += b.x;248                 p.position.y += b.y249             }250             f.stroke();251             f.closePath();252             c.trail.length > 60 && c.trail.shift();253             f.beginPath();254             f.fillStyle = "#8ff1ff";255             f.arc(c.position.x, c.position.y, c.size / 2, 0, Math.PI * 2, true);256             f.fill()257         }258         if (n && (c.position.x < 0 || c.position.x > m || c.position.y < 0 || c.position.y > l)) {259             F(c.position, 10);260             t()261         }262         for (d = 0; d < o.length; d++) {263             p = o[d];264             if (n) if (c.shield > 0 && p.distanceTo(c.position) < (c.size * 4 + p.size) * 0.5) {265                 //playSound("fx_break");266                 F(p.position, 10);267                 o.splice(d, 1);268                 d--;269                 h += 10 * a;270                 A += 10 * a;271                 continue272             } else if (p.distanceTo(c.position) < (c.size + p.size) * 0.5) {273                 F(c.position, 10);274                 t()275             }276             f.beginPath();277             f.fillStyle = "#ff0000";278             f.arc(p.position.x, p.position.y, p.size / 2, 0, Math.PI * 2, true);279             f.fill();280             p.position.x += b.x * p.force;281             p.position.y += b.y * p.force;282             if (p.position.x < -p.size || p.position.y > l + p.size) {283                 o.splice(d, 1);284                 d--285             }286         }287         for (d = 0; d < w.length; d++) {288             p = w[d];289             if (p.distanceTo(c.position) < (c.size + p.size) * 0.5 && n) {290                 //playSound("MusicFunARR");291                 //playSound("fx_bubble");292                 c.shield = 300;293                 for (i = 0; i < o.length; i++) {294                     e = o[i];295                     if (e.distanceTo(p.position) < 100) {296                         //playSound("fx_break");297                         F(e.position, 10);298                         o.splice(i, 1);299                         i--;300                         h += 10 * a;301                         A += 10 * a302                     }303                 }304             }305             f.beginPath();306             f.fillStyle = "#00ffcc";307             f.arc(p.position.x, p.position.y, p.size / 2, 0, Math.PI * 2, true);308             f.fill();309             p.position.x += b.x * p.force;310             p.position.y += b.y * p.force;311             if (p.position.x < -p.size || p.position.y > l + p.size || c.shield != 0) {312                 w.splice(d, 1);313                 d--314             }315         }316         o.length < 35 * r && o.push(W(new Enemy));317         w.length < 1 && Math.random() > 0.997 && c.shield == 0 && w.push(W(new Shield));318         //c.shield == 1 && n && playSound("MusicCalmARR");319         for (d = 0; d < G.length; d++) {320             p = G[d];321             p.velocity.x += (b.x - p.velocity.x) * 0.04;322             p.velocity.y += (b.y - p.velocity.y) * 0.04;323             p.position.x += p.velocity.x;324             p.position.y += p.velocity.y;325             p.alpha -= 0.02;326             f.fillStyle = "rgba(255,255,255," + Math.max(p.alpha, 0) + ")";327             f.fillRect(p.position.x, p.position.y, 1, 1);328             p.alpha <= 0 && G.splice(d, 1)329         }330         if (n) {331             /*scoreText = "Score: <span>" + Math.round(h) + "</span>";332             scoreText += " Time: <span>" + Math.round(((new Date).getTime() - C) / 1E3 * 100) / 100 + "s</span>";333             scoreText += ' <p class="fps">FPS: <span>' + Math.round(u) + " (" + Math.round(Math.max(Math.min(u / x, x), 0) * 100) + "%)</span></p>";*/334             //q.innerHTML = scoreText335             scoreText = "得分: <span style='color:lightblue;'> " + Math.round(h) + " </span>";336             scoreText += " 持续: <span style='color:lightblue;'>" + Math.round(((new Date).getTime() - C) / 1E3 * 100) / 100 + "秒</span>";337             scoreText += "<span style='float:right;'>FPS: <span style='color:lightblue;'>" + Math.round(u) + " (" + Math.round(Math.max(Math.min(u / x, x), 0) * 100) + "%)</span></span>";338             btn_p.innerHTML = scoreText;339         }340     }341     /*generate enemy*/342     function W(a) {343         if (Math.random() > 0.5) {344             a.position.x = Math.random() * m;345             a.position.y = -20346         } else {347             a.position.x = m + 20;348             a.position.y = -l * 0.2 + Math.random() * l * 1.2349         }350         return a351     }352     var v = navigator.userAgent.toLowerCase().indexOf("android") != -1 || navigator.userAgent.toLowerCase().indexOf("iphone") != -1 || navigator.userAgent.toLowerCase().indexOf("ipad") != -1,353     m = v ? window.innerWidth: 900,354     l = v ? window.innerHeight: 550,355     x = 60,356     k,357     f,358     q,359     s,360     R,361     X,362     E,363     o = [],364     w = [],365     G = [],366     c,367     y = window.innerWidth - m,368     z = window.innerHeight - l,369     n = false,370     h = 0,371     C = 0,372     Q = 0,373     r = 1,374     K = 0,375     J = 0,376     I = 0,377     A = 0,378     H = {379         x: -1.3,380         y: 1381     },382     u = 0,383     M = 1E3,384     N = 0,385     P = (new Date).getTime(),386     O = 0,387     g = [],388     T,389     B,390     D,391     Y,392     S,393     //add394     btn_ss,395     btn_p;396     this.init = function() {397         /*canvas*/398         k = document.getElementById("world");399         btn_ss = document.getElementById("btn_ss");400         btn_p = document.getElementById("btn_p");401         //s = document.getElementById("panels");402         //q = document.getElementById("status");403         //document.getElementById("message");404         //R = document.getElementById("title");405         //X = document.getElementById("startButton");406         //E = document.getElementById("seeMore");407         //document.getElementById("highscoreList");408         //T = document.getElementById("highscoreOutput");409         //B = document.getElementById("highscoreWin");410         //D = document.getElementById("highscoreInput");411         //Y = document.getElementById("highscoreSubmit");412         //S = document.getElementById("highscorePlace");413         if (k && k.getContext) {414             f = k.getContext("2d");415             document.addEventListener("mousemove", ca, false);416             document.addEventListener("mousedown", da, false);417             document.addEventListener("mouseup", ea, false);418             k.addEventListener("touchstart", fa, false);419             document.addEventListener("touchmove", ga, false);420             document.addEventListener("touchend", ha, false);421             window.addEventListener("resize", U, false);422             /*start botton event*/423             btn_ss.addEventListener("touchstart", btn_ss_click, false);424             btn_ss.addEventListener("click", btn_ss_click, false);425             //X.addEventListener("click", j, false);426             //Y.addEventListener("click", $, false);427             c = new Player;428             U();429             if (v) {430                 /*deal with sharing and some others*/431                 //document.getElementById("sharing").style.display = "none";432                 //document.getElementById("panel").style.display = "none";433                 //q.style.width = m + "px";434                 /*是手机的时候*/435                 k.style.border = "none";436                 H.x *= 2;437                 H.y *= 2;438                 setInterval(V, 1E3 / 30)439             } else setInterval(V, 1E3 / x);440             //ba();441             /*v || swfobject.embedSWF("swf/sound.swf", "sound", "1", "1", "9.0.0", "", {},442             {443                 allowScriptAccess: "always"444             },445             {446                 id: "soundSWF"447             })*/448         }449     };450     /*deal with score >delete*/451     /*ajax = {452         ghs: function(a) {453             var b = new XMLHttpRequest;454             parameters = "m=ghs";455             b.open("POST", "highscore.php", true);456             b.setRequestHeader("Content-type", "application/x-www-form-urlencoded");457             if (b) {458                 b.onreadystatechange = function() {459                     b.readyState == 4 && b.status == 200 && a(b.responseText)460                 };461                 b.send(parameters)462             }463         },464         shs: function(a, b) {465             var d = new XMLHttpRequest;466             b += "&m=shs";467             if (d) {468                 d.open("POST", "highscore.php", true);469                 d.setRequestHeader("Content-type", "application/x-www-form-urlencoded");470                 d.onreadystatechange = function() {471                     d.readyState == 4 && d.status == 200 && a(d.responseText)472                 };473                 d.send(b)474             }475         }476     }*/477 };478 function Point(j, t) {479     this.position = {480         x: j,481         y: t482     }483 }484 Point.prototype.distanceTo = function(j) {485     var t = j.x - this.position.x;486     j = j.y - this.position.y;487     return Math.sqrt(t * t + j * j)488 };489 Point.prototype.clonePosition = function() {490     return {491         x: this.position.x,492         y: this.position.y493     }494 };495 function Player() {496     this.position = {497         x: 0,498         y: 0499     };500     this.trail = [];501     this.size = 8;502     this.shield = 0503 }504 Player.prototype = new Point;505 function Enemy() {506     this.position = {507         x: 0,508         y: 0509     };510     this.size = 6 + Math.random() * 4;511     this.force = 1 + Math.random() * 0.4512 }513 Enemy.prototype = new Point;514 function Shield() {515     this.position = {516         x: 0,517         y: 0518     };519     this.size = 10 + Math.random() * 8;520     this.force = 1 + Math.random() * 0.4521 }522 Shield.prototype = new Point;523 SinuousWorld.init();524 /*deal with sound >delete*/525 /*function sendToJavaScript(j) {526     j == "SoundController ready and loaded!" && playSound("MusicIdleARR")527 }528 function playSound(j) {529     navigator.userAgent.toLowerCase().indexOf("android") != -1 || navigator.userAgent.toLowerCase().indexOf("iphone") != -1 || navigator.userAgent.toLowerCase().indexOf("ipad") != -1 || document.getElementById("soundSWF").sendToActionScript(j)530 };*/

---

CSDN下载:

http://download.csdn.net/detail/wangxsh42/7566753

0 0
原创粉丝点击