找回密码
 立即注册
楼主: 多米诺

[脚本] 植物大战僵尸的脚本规范下载

[复制链接]
发表于 2012-6-11 23:46 | 显示全部楼层 |阅读模式
  1. function SelectZombie(){
  2.     //选择上场僵尸
  3.     var AlreadySelectNum=oGP.ArrayZombies.length;
  4.     var SelectNum=10-AlreadySelectNum;
  5.     var n,m;
  6.     if(oGP.CanSelectZombies!=''){
  7.         var aSelect=oGP.CanSelectZombies.split(',');
  8.         for(n=1;n<=SelectNum;n++){
  9.             if(aSelect.length==0){break;}
  10.             m=Math.floor(Math.random()*aSelect.length);
  11.             oGP.ArrayZombies.push(aSelect[m]);
  12.             aSelect.splice(m,1);
  13.         }
  14.     }
  15.     var OZombie,HP;
  16.     for(n=0;n<oGP.ArrayZombies.length;n++){
  17.         eval('OZombie='+oGP.ArrayZombies[n]);
  18.         HP=OZombie.HP+OZombie.OrnHP;
  19.         switch(true){
  20.             case HP<420:
  21.                 ArrayZombies[1].push(oGP.ArrayZombies[n]);
  22.                 break;
  23.             case HP>=420&&HP<1300:
  24.                 ArrayZombies[2].push(oGP.ArrayZombies[n]);
  25.                 break;
  26.             default:
  27.                 ArrayZombies[3].push(oGP.ArrayZombies[n]);            
  28.         }
  29.     }
  30. }

  31. function StartGame(){
  32.     oGP.BeginCool(); //卡片的开场冷却
  33.     oGP.Monitor(); //全局监控计时器
  34.     SunCoolTime=Math.floor(5+Math.random()*4); //随机时间5-8秒开局掉落阳光
  35.     SunCoolTime*=1000;
  36.     setTimeout('AutoProduceSun(25)',SunCoolTime); //阳光掉落计时器
  37.     MovePeashooterBullet(); //移动豌豆计时器,只有选择了豌豆家族才执行计时器
  38.     MoveStarBullet(); //移动杨桃子弹
  39.     setTimeout('AddZombiesFlag();MoveZombies();',15000); //开局刷怪//移动所有僵尸的公用计时器,开场调用
  40. }
  41. function AutoProduceSun(num){
  42.     //自动掉落阳光的计时器
  43.     if(Win==1||Win==-1){return(false);}
  44.     var rC,rR;
  45.     var SunCoolTime;
  46.     rC=Math.floor(1+Math.random()*oGP.MaxC); //阳光的随机格子坐标
  47.     rR=Math.floor(1+Math.random()*oGP.MaxR);
  48.     SunCoolTime=Math.floor(9+Math.random()*3); //随机时间9-11秒
  49.     SunCoolTime*=1000;
  50.     setTimeout('AutoProduceSun('+num+')',SunCoolTime);
  51.     AppearSun(GetX(rC),GetY(rR),num,1);
  52. }
  53. function MoveDropSun(id,num,MaxY){
  54.     //自然掉落阳光过程计时器
  55.     var ob=document.getElementById(id);
  56.     if(ob!='[object]'){return(false);}
  57.     if(ob.click==1){return(false);}
  58.     if(ob.style.pixelTop<MaxY-33-20){ //还没掉到最大Y值,继续掉落
  59.         ob.style.pixelTop+=4;
  60.         window.setTimeout('MoveDropSun("'+ob.id+'",'+num+','+MaxY+')',50);
  61.     }else{
  62.         window.setTimeout('DisappearSun("'+ob.id+'")',8000); //调用阳光消失function
  63.     }
  64. }
  65. function AppearSun(X,Y,num,ifBeginMove){
  66.     //产生阳光,XY表示坐标,num表示阳光数量,ifBeginMove表示是否开启阳光向下移动计时器,向日葵产生的阳光不开启,自然产生的阳光立即开启
  67.     if(Win==1||Win==-1){return(false);} //胜利,取消产生阳光
  68.     var obImg=new Image();
  69.     obImg.src=dicGroundGif('Sun').src;
  70.     obImg.id='Sun_'+NumSun;
  71.     obImg.width=65;
  72.     obImg.height=67;
  73.     obImg.style.position='absolute';
  74.     obImg.style.pixelLeft=X;
  75.     obImg.style.cursor='hand';
  76.     obImg.style.zIndex=25;
  77.     obImg.style.filter='alpha(opacity=90) Glow(Color="#FFFFFF",Strength="3")';
  78.     obImg.click=0;
  79.     obImg.SunNum=num;
  80.     NumSun+=1;
  81.     if(ifBeginMove==1){
  82.         obImg.style.pixelTop=90-obImg.height/2;
  83.         document.getElementById('dAll').appendChild(obImg);
  84.         document.getElementById(obImg.id).onclick=function(){ClickSun(obImg);}
  85.         window.setTimeout('MoveDropSun("'+obImg.id+'",'+num+','+Y+')',100);
  86.     }else{
  87.         obImg.style.pixelTop=Y-obImg.height/2-20;
  88.         document.getElementById('dAll').appendChild(obImg);
  89.         document.getElementById(obImg.id).onclick=function(){ClickSun(obImg);}
  90.         window.setTimeout('DisappearSun("'+obImg.id+'")',8000); //调用阳光消失function
  91.     }
  92. }
  93. function DisappearSun(id){
  94.     //阳光消失
  95.     var ob=document.getElementById(id);
  96.     if(ob!='[object]'){return(false);}
  97.     document.getElementById('dAll').removeChild(ob);
  98. }
  99. function ClickSun(ob){
  100.     //拾取阳光
  101.     if(ob.click==1){return(false);}
  102.     oGP.SunNum+=ob.SunNum;
  103.     if(oGP.SunNum>=9990){oGP.SunNum=9990;}
  104.     ob.click=1;
  105.     document.getElementById('tSunNum').innerText=oGP.SunNum;
  106.     MoveClickSun(ob);
  107. }
  108. function MoveClickSun(ob){
  109.     //移动拾取的阳光到左上角
  110.     var X1=9,Y1=6;
  111.     var X2=ob.style.pixelLeft,Y2=ob.style.pixelTop;
  112.     var X,Y;
  113.     X=X2-30;
  114.     Y=(X-X1)/(X2-X1)*(Y2-Y1)+Y1;
  115.     ob.style.pixelLeft=X;
  116.     ob.style.pixelTop=Y;
  117.     if(ob.style.pixelLeft>9){
  118.         window.setTimeout('MoveClickSun('+ob.id+')',10);
  119.     }else{
  120.         document.getElementById('dAll').removeChild(ob);
  121.     }
  122. }
  123. function CanGrow(C,R){
  124.     //是否可以种植选定植物
  125.     if(ChoseClassName.canGrow.match(oGP.aPAfterGrow[C][R])==null){ //先判断当前场地属性是否可以种植
  126.         return(false); //不能种植
  127.     }
  128.     if(ChoseClassName.isGroundPlant==1){ //是容器植物
  129.         if(oGP.aPlant[C][R][0]!=''||oGP.aPlant[C][R][1]!=''){ //已经有普通植物了,不能再种植容器植物
  130.             return(false);
  131.         }
  132.         if(oGP.aGroundPlant[C][R][0]!=''&&oGP.aGroundPlant[C][R][1]!=''){ //场地已经有两种容器植物了
  133.             return(false);
  134.         }
  135.     }else{ //不是容器植物
  136.         if(ChoseClassName.isProtectPlant==1){ //是保护性植物
  137.             if(oGP.aPlant[C][R][1]!=''){ //已经有保护性植物了
  138.                 return(false);
  139.             }
  140.         }else{ //不是保护性植物
  141.             if(oGP.aPlant[C][R][0]!=''){ //已经有植物了
  142.                 if(ChoseClassName.onOtherPlant==''){ //选择植物必须单独种植,不能种植在其他植物上
  143.                     return(false);
  144.                 }else{
  145.                     var ob=document.getElementById(oGP.aPlant[C][R][0]); //获取选择格子上的植物
  146.                     if(ChoseClassName.onOtherPlant!=ob.EName){ //必须种植的植物不是格子上的植物
  147.                         return(false);
  148.                     }
  149.                 }
  150.             }else{
  151.                 if(ChoseClassName.onOtherPlant!=''){return(false);}
  152.             }
  153.         }
  154.     }
  155.     return(true);
  156. }

  157. function InitCard(){
  158.     //放置所有卡片
  159.     var n,a;
  160.     var I=(new VBArray(dicCardGif.Items())).toArray();
  161.     if(dicCardGif.Count==0){return(false);}
  162.     for(n=0;n<I.length;n++){
  163.         document.getElementById('tCard'+n).innerHTML='<img id="Card'+n+'" C="'+I[n].C+'" border="0" src="'+I[n].src+'" alt="'+I[n].alt+'" style="filter:gray;position:absolute;left:0;top:5;" onclick="ChosePlant(this.id);" HaveEnoughSun="0" isReady="0">';
  164.     }
  165. /*
  166.     for(n=1;n<CardImage.length;n++){
  167.         a=CardImage[n].split(';');
  168.         document.getElementById('tCard'+n).innerHTML='<img id="Card'+n+'" C="'+a[1]+'" border="0" src="'+a[0]+'" alt="'+a[2]+'" style="filter:gray;position:absolute;left:0;top:5;" onclick="ChosePlant(this.id);" HaveEnoughSun="0" isReady="0">';
  169.     }
  170. */
  171. }

  172. function CancelPlant(){
  173.     //放弃种植
  174.     ChoseCard.style.filter='';
  175.     ChoseClassName=null;
  176.     Chose=0;
  177.     document.getElementById('dAll').removeChild(document.getElementById('movePlant'));
  178.     document.getElementById('dAll').removeChild(document.getElementById('movePlantAlpha'));
  179. }
  180. function CancelShovel(){
  181.     //放弃铲子
  182.     var ob=document.getElementById('imgShovel');
  183.     ob.style.position='relative';
  184.     ob.style.pixelLeft=0;
  185.     ob.style.pixelTop=0;
  186.     ob.style.zIndex=1;
  187.     Chose=0;

  188. }
  189. function ChoseShovel(){
  190.     //选择铲子
  191.     if(Chose==1){CancelPlant();}
  192.     Chose=-1;
  193.     var ob=document.getElementById('imgShovel');
  194.     ob.style.position='absolute';
  195.     ob.style.pixelLeft=event.clientX-40;
  196.     ob.style.pixelTop=event.clientY-40;
  197.     ob.style.zIndex=50;
  198. }

  199. function ChosePlant(ID){
  200.     //选择植物
  201.     ChoseCard=document.getElementById(ID);
  202.     if(ChoseCard.HaveEnoughSun==0||ChoseCard.isReady==0){return(false);}
  203.     ChoseCard.style.filter='gray';
  204.     eval('ChoseClassName='+ChoseCard.C);
  205.     Chose=1;
  206.     var movePlant=new Image();
  207.     var movePlantAlpha=new Image();
  208.     movePlant.src=dicPlantsGif(ChoseClassName.EName).src;
  209.     movePlantAlpha.src=dicPlantsGif(ChoseClassName.EName).src;
  210.     movePlant.id='movePlant';
  211.     //movePlant.setAttribute('src',dicPlantsGif(ChoseClassName.EName).src);
  212.     movePlant.width=ChoseClassName.width;
  213.     movePlant.height=ChoseClassName.height;
  214.     movePlant.style.position='absolute';
  215.     movePlant.style.pixelLeft=event.clientX-ChoseClassName.width/2;
  216.     movePlant.style.pixelTop=event.clientY-ChoseClassName.height/2;
  217.     movePlant.style.zIndex=31;

  218.     //movePlantAlpha.setAttribute('src',dicPlantsGif(ChoseClassName.EName).src);
  219.     movePlantAlpha.style.filter='alpha(opacity=40)';
  220.     movePlantAlpha.style.zIndex=30;

  221.     movePlantAlpha.id='movePlantAlpha';
  222.     movePlantAlpha.width=ChoseClassName.width;
  223.     movePlantAlpha.height=ChoseClassName.height;
  224.     movePlantAlpha.style.position='absolute';   
  225.     movePlantAlpha.style.display='none';
  226.     document.getElementById('dAll').appendChild(movePlant);
  227.     document.getElementById('dAll').appendChild(movePlantAlpha);

  228. }
  229. function DoCoolTimer(n,a,b){
  230.     //冷却计时器
  231.     var ob=document.getElementById('Card'+n+'_1');
  232.     ob.style.clip='rect(0,'+ob.width+','+ob.height*(a-b)+',0)';
  233.     if(a-b>0){
  234.         window.setTimeout('DoCoolTimer('+n+','+(a-b)+','+b+')',1000);
  235.     }else{
  236.         document.getElementById('tCard'+n).removeChild(ob);
  237.         document.getElementById('Card'+n).isReady=1;
  238.     }
  239. }
  240. function GrowPlant(X,Y){
  241.     //放置某个植物
  242.     //X,Y:鼠标实际坐标
  243.     var rX,rY; //rX,rY:植物底边中点坐标
  244.     var pX,pY; //pX,pY:植物的实际坐标
  245.     var R,C;   //R,C:列,行
  246.     var aX,aY; //临时数组
  247.     rX=ChosePlantX(X)
  248.     rY=ChosePlantY(Y+document.body.scrollTop);
  249.     if(rY==0){
  250.         CancelPlant();
  251.         return(false);
  252.     }
  253.     C=GetPlantC(rX);R=GetPlantR(rY);
  254.     pX=rX-ChoseClassName.width/2;
  255.     pY=rY-ChoseClassName.height+ChoseClassName.GetDeviationY(C,R);
  256.     //判断能否种植在该场地上
  257.     if(!CanGrow(C,R)){return(false);}
  258.     Chose=0;
  259.     ChoseCard.style.filter='';
  260.     var plant=new Image();
  261.     var d=new Date(),s='';
  262.     s += d.getHours()+'_'+d.getMinutes()+'_'+d.getSeconds()+'_'+d.getMilliseconds();
  263.     plant.id='P_'+ChoseClassName.EName+'_'+s;
  264.     //plant.setAttribute('src',ChoseClassName.normalGif);
  265.     plant.EName=ChoseClassName.EName;
  266.     plant.name='Plants';
  267.     plant.C=C;
  268.     plant.R=R;
  269.     plant.beAttackedPointL=ChoseClassName.beAttackedPointL;
  270.     plant.beAttackedPointR=ChoseClassName.beAttackedPointR;
  271.     plant.HP=ChoseClassName.HP;
  272.     plant.width=ChoseClassName.width;
  273.     plant.height=ChoseClassName.height;
  274.     plant.style.position='absolute';
  275.     plant.style.pixelLeft=pX;
  276.     plant.style.pixelTop=pY;
  277.     plant.AttackedLX=pX+plant.beAttackedPointL; //左受攻击点的X
  278.     plant.AttackedRX=pX+plant.beAttackedPointR; //右受攻击点的X
  279.     plant.style.zIndex=3*R;
  280.     plant.unrivaled=0; //是否无敌
  281.     plant.onmousedown=function(){if(event.button==1&&Chose==-1){fShovel(plant.id);}} //铲除植物
  282.     plant.onmousemove=function(){if(Chose==-1){SelectShovel(plant.id);}} //选择要铲除的植物,发光
  283.     plant.onmouseout=function(){if(Chose==-1){CancelSelectShovel(plant.id);}}
  284.     //减少阳光
  285.     oGP.SunNum=parseInt(oGP.SunNum)-ChoseClassName.SunNum;
  286.     document.getElementById('tSunNum').innerText=oGP.SunNum;
  287.     var dOb=document.getElementById('dAll');
  288.     if(ChoseClassName.onOtherPlant!=''){
  289.         if(oGP.aPlant[C][R][0]!=''){
  290.             var tmpOb;
  291.             tmpOb=document.getElementById(oGP.aPlant[C][R][0]);
  292.             eval(tmpOb.EName+'.Die('+tmpOb.id+')'); //如果是必须种植在其他植物上的升级植物,则调用原植物的死亡函数
  293.         }
  294.     }
  295.     dOb.appendChild(plant);
  296.     ChoseClassName.Birth(plant); //调用植物出生方法
  297.     dOb.removeChild(document.getElementById('movePlant'));
  298.     dOb.removeChild(document.getElementById('movePlantAlpha'));
  299.     var n=ChoseCard.id.substr(4);
  300.     document.getElementById('tCard'+n).innerHTML+='<img id="Card'+n+'_1" border="0" src="'+dicCardGif(ChoseClassName.EName).src+'" alt="'+ChoseClassName.CName+'" style="filter:Xray;position:absolute;left:0;top:5;">';
  301.     var ob=document.getElementById('Card'+n);
  302.     ob.style.cursor='';
  303.     ob.isReady=0;
  304.     DoCoolTimer(n,1,1000/ChoseClassName.coolTime); //调用冷却方法,在卡片上显示冷却进度
  305. }
  306. function PlantStatus(id){
  307.     //判断植物的状态来更改filter或者src等,由僵尸攻击函数ZombieAttack调用
  308.     var ob=document.getElementById(id);
  309.     var OPlant,HP=ob.HP;
  310.     eval('OPlant='+ob.EName);
  311.     switch(ob.EName){
  312.         case 'oPumpkinHead': //南瓜头
  313.             switch(true){
  314.                 case HP<=1333:
  315.                     if(ob.src!=dicPlantsGif('PumpkinHeadHurt2').src){
  316.                         ob.src=dicPlantsGif('PumpkinHeadHurt2').src;
  317.                         ob.width=dicPlantsGif('PumpkinHeadHurt2').width;
  318.                         ob.height=dicPlantsGif('PumpkinHeadHurt2').height;
  319.                     }
  320.                     break;
  321.                 case HP<=2666:
  322.                     if(ob.src!=dicPlantsGif('PumpkinHeadHurt1').src){
  323.                         ob.style.pixelTo+=8;
  324.                         ob.src=dicPlantsGif('PumpkinHeadHurt1').src;
  325.                         ob.width=dicPlantsGif('PumpkinHeadHurt1').width;
  326.                         ob.height=dicPlantsGif('PumpkinHeadHurt1').height;
  327.                         var ob1=document.getElementById(ob.id+'_2');
  328.                         ob1.style.pixelTop+=8;
  329.                         ob1.src=dicPlantsGif('PumpkinHeadBackHurt').src;
  330.                         ob1.width=dicPlantsGif('PumpkinHeadBackHurt').width;
  331.                         ob1.height=dicPlantsGif('PumpkinHeadBackHurt').height;
  332.                     }
  333.                     break;
  334.             }
  335.             break;
  336.         case 'oWallNut': //坚果墙
  337.             switch(true){
  338.                 case HP<=1333:
  339.                     if(ob.src!=dicPlantsGif('WallNutHurt2').src){
  340.                         ob.style.pixelTop-=1;
  341.                         ob.src=dicPlantsGif('WallNutHurt2').src;
  342.                         ob.width=dicPlantsGif('WallNutHurt2').width;
  343.                         ob.height=dicPlantsGif('WallNutHurt2').height;
  344.                     }
  345.                     break;
  346.                 case HP<=2666:
  347.                     if(ob.src!=dicPlantsGif('WallNutHurt1').src){
  348.                         ob.style.pixelTo-=2;
  349.                         ob.src=dicPlantsGif('WallNutHurt1').src;
  350.                         ob.width=dicPlantsGif('WallNutHurt1').width;
  351.                         ob.height=dicPlantsGif('WallNutHurt1').height;
  352.                     }
  353.                     break;
  354.             }
  355.             break;
  356.         case 'oTallNut': //高坚果
  357.             switch(true){
  358.                 case HP<=2666:
  359.                     if(ob.src!=dicPlantsGif('TallNutHurt2').src){
  360.                         ob.src=dicPlantsGif('TallNutHurt2').src;
  361.                     }
  362.                     break;
  363.                 case HP<=5332:
  364.                     if(ob.src!=dicPlantsGif('TallNutHurt1').src){
  365.                         ob.src=dicPlantsGif('TallNutHurt1').src;
  366.                     }
  367.                     break;
  368.             }
  369.             break;
  370.         case 'oGralic': //大蒜
  371.             switch(true){
  372.                 case HP<=133:
  373.                     if(ob.src!=dicPlantsGif('GarlicHurt2').src){
  374.                         ob.src=dicPlantsGif('GarlicHurt2').src;
  375.                     }
  376.                     break;
  377.                 case HP<=266:
  378.                     if(ob.src!=dicPlantsGif('GarlicHurt1').src){
  379.                         ob.src=dicPlantsGif('GarlicHurt1').src;
  380.                     }
  381.                     break;
  382.             }
  383.             break;
  384.     }
  385. }

  386. function getElementsByName(tag,eltname){
  387.     var elts=document.getElementsByTagName(tag);
  388.     var count=0;
  389.     var elements=[];
  390.     for(var i=0;i<elts.length;i++){
  391.         if(elts[i].getAttribute("name")==eltname){
  392.             elements[count++]=elts[i];
  393.         }
  394.     }
  395.     return elements;
  396. }

  397. function initZombie(obName){
  398.     var zombie=new Image();
  399.     var ob,C=11,R;
  400.     eval('ob='+obName);
  401.     switch(oGP.GroundKind){
  402.         case '水池':
  403.             var aGr=new Array(1,2,5,6); //草地行
  404.             if(ob.canAppear.match('[草地]')!=null){
  405.                 R=aGr[Math.floor(0+Math.random()*4)];
  406.             }else{
  407.                 R=Math.floor(3+Math.random()*2);
  408.             }
  409.             break;
  410.         case '草地':
  411.             R=Math.floor(1+Math.random()*5);
  412.             break;
  413.     }
  414.     //zombie.src=dicZombiesGif(obName).src;
  415.     zombie.src=ob.NormalGif;
  416.     NumZombies+=1; //僵尸实时数量
  417.     NoZombies+=1; //僵尸已经出现过的数量
  418.     oGP.aR[R]+=1; //每行僵尸增加1
  419.     //var d=new Date(),s='';
  420.     //s += d.getHours()+'_'+d.getMinutes()+'_'+d.getSeconds()+'_'+d.getMilliseconds();
  421.     //zombie.id='Z_'+ob.EName+'_'+s;
  422.     zombie.id='Z_'+ob.EName+'_'+NoZombies;
  423.     //zombie.name='Zombies';
  424.     zombie.setAttribute('name','Zombies');
  425.     zombie.EName=ob.EName;
  426.     zombie.C=C;
  427.     zombie.R=R;
  428.     zombie.HP=ob.HP;
  429.     zombie.OrnHP=ob.OrnHP; //饰品血量
  430.     zombie.NormalGif=ob.NormalGif;
  431.     zombie.AttackGif=ob.AttackGif;
  432.     zombie.beAttacked=1;
  433.     zombie.isAttacking=0; //是否正在攻击
  434.     zombie.Speed=ob.Speed;
  435.     zombie.FreeSetbodyTime='' //取消定身时间
  436.     zombie.FreeFreezeTime=''; //取消被冰冻时间
  437.     zombie.FreeSlowTime=''; //取消被减速的时间
  438.     zombie.againstFreeze=ob.againstFreeze; //是否免疫冰冻
  439.     zombie.againstSlow=ob.againstSlow; //是否免疫减速
  440.     zombie.againstSputtering=ob.againstSputtering; //是否免疫溅射
  441.     zombie.WalkDirection=ob.WalkDirection; //0表示往左走,1表示往右走
  442.     zombie.beAttackedPointL=ob.beAttackedPointL; //左受攻击点相对于pixelLeft右偏移的距离
  443.     zombie.beAttackedPointR=ob.beAttackedPointR; //右受攻击点相对于pixelLeft右偏移的距离
  444.     zombie.width=ob.width;
  445.     zombie.height=ob.height;
  446.     zombie.style.position='absolute';
  447.     zombie.style.pixelLeft=GetX(C)-ob.beAttackedPointL;
  448.     zombie.X=zombie.style.pixelLeft; //X可以取小数
  449.     zombie.AttackedLX=zombie.X+zombie.beAttackedPointL; //实时改变的左受攻击点的X
  450.     zombie.AttackedRX=zombie.X+zombie.beAttackedPointR; //实时改变的右受攻击点的X
  451.     zombie.style.pixelTop=GetY(R)-parseInt(ob.height);
  452.     zombie.style.zIndex=3*R+1;
  453.     var dOb=document.getElementById('dAll');
  454.     dOb.appendChild(zombie);
  455.     var ChoseZombieClassName;
  456.     eval('ChoseZombieClassName='+zombie.EName);
  457.     ChoseZombieClassName.Birth(zombie);
  458. }
  459. function ShowLargeWave(){
  460.     //一大波僵尸正在接近
  461.     if(document.getElementById('LargeWave')==null){
  462.         var img=new Image();
  463.         img.id='LargeWave';
  464.         img.src=dicGroundGif('LargeWave').src;
  465.         img.style.position='absolute';
  466.         img.style.pixelLeft=oGP.MaxWidth/2-143;
  467.         img.style.pixelTop=oGP.MaxHeight/2-17;
  468.         img.style.zIndex=50;
  469.         document.getElementById('dAll').appendChild(img);
  470.         setTimeout('document.getElementById("dAll").removeChild('+img.id+')',5000);
  471.     }
  472. }
  473. function ShowFinalWave(){
  474.     //最后一波僵尸
  475.     if(document.getElementById('FinalWave')==null){
  476.         var img=new Image();
  477.         img.id='FinalWave';
  478.         img.src=dicGroundGif('LargeWave').src;
  479.         img.style.position='absolute';
  480.         img.style.pixelLeft=oGP.MaxWidth/2-143;
  481.         img.style.pixelTop=oGP.MaxHeight/2-17;
  482.         img.style.zIndex=50;
  483.         document.getElementById('dAll').appendChild(img);
  484.         setTimeout('document.getElementById("FinalWave").style.display="none";document.getElementById("FinalWave").src="'+dicGroundGif('FinalWave').src+'"',6000);
  485.         setTimeout('document.getElementById("FinalWave").style.display="block";document.getElementById("FinalWave").style.pixelLeft='+(oGP.MaxWidth/2-143)+';document.getElementById("FinalWave").style.pixelTop='+(oGP.MaxHeight/2-17),7000);
  486.         setTimeout('document.getElementById("dAll").removeChild('+img.id+')',7500);
  487.     }
  488. }
  489. function RefreshZombiesTimer(Num){
  490.     //刷新的计时器
  491.     Num+=1;
  492.     if(FlagZombies==9){
  493.         if(Num>=200&&Num<=210){ShowLargeWave();}
  494.     }else{
  495.         if(FlagZombies==19&&Num>=170&&Num<=180){ShowFinalWave();}
  496.     }
  497.     if(Num>=250){ //大于最大时间25秒
  498.         AlreadyAddZombiesFlag=1;
  499.         AddZombiesFlag();
  500.         Num=0;
  501.         return(false);
  502.     }
  503.     if(NumZombies==0&&AlreadyAddZombiesFlag==0){
  504.         AlreadyAddZombiesFlag=1;
  505.         switch(true){
  506.             case FlagZombies==9:
  507.                 ShowLargeWave();
  508.             case FlagZombies>=1&&FlagZombies<9:
  509.                 setTimeout('AddZombiesFlag()',5000);
  510.                 break;
  511.             case FlagZombies==19:
  512.                 ShowFinalWave();
  513.                 setTimeout('AddZombiesFlag()',8000);
  514.                 break;
  515.             case FlagZombies>9&&FlagZombies<20:
  516.                 setTimeout('AddZombiesFlag()',5000);
  517.                 break;
  518.         }
  519.         return(false);
  520.     }
  521.     setTimeout('RefreshZombiesTimer('+Num+')',100);
  522. }
  523. function SelectFlagZombie(SumNum){
  524.     //组合每波的僵尸种类;
  525.     var aZ=new Array();
  526.     var aTmp=new Array();
  527.     var n,m;
  528.     var U,tmp=ArrayZombies.length-1; //表示僵尸的最高强度是3;
  529.     while(true){
  530.         if(SumNum<=0){break;}
  531.         if(SumNum<tmp){
  532.             U=SumNum;
  533.         }else{
  534.             U=tmp;
  535.         }
  536.         for(n=1;n<=U;n++){
  537.             for(m=0;m<ArrayZombies[n].length;m++){
  538.                 aTmp.push([n,ArrayZombies[n][m]]);
  539.             }
  540.         }
  541.         if(aTmp.length==0){
  542.             for(n=1;n<=tmp;n++){
  543.                 if(ArrayZombies[n].length>0){
  544.                     for(m=0;m<ArrayZombies[n].length;m++){
  545.                         aTmp.push([n,ArrayZombies[n][m]]);
  546.                     }
  547.                     break;
  548.                 }
  549.             }
  550.         }
  551.         n=Math.floor(Math.random()*aTmp.length);
  552.         aZ.push(aTmp[n][1]);
  553.         SumNum-=aTmp[n][0];
  554.     }
  555.     return(aZ);
  556. }
  557. function AddZombiesFlag(){
  558.     //添加僵尸Flag
  559.     var R;
  560.     var SumNum; //僵尸强度
  561.     var aTmp; //临时数组
  562.     var n;
  563.     var UboundTime;
  564.     FlagZombies+=1;
  565.     switch(true){
  566.         case FlagZombies>=1&&FlagZombies<=3:
  567.             SumNum=1;
  568.             UboundTime=10001;
  569.             SetTimeoutZombie(SumNum,UboundTime)
  570.             //initZombie(Math.floor(Math.random()*ArrayZombies[1].length));
  571.             break;
  572.         case FlagZombies>=4&&FlagZombies<=5:
  573.             SumNum=2;
  574.             UboundTime=10001;
  575.             SetTimeoutZombie(SumNum,UboundTime)
  576.             break;
  577.         case FlagZombies>=6&&FlagZombies<=9:
  578.             SumNum=3;
  579.             UboundTime=10001;
  580.             SetTimeoutZombie(SumNum,UboundTime)
  581.             break;            
  582.         case FlagZombies==10:
  583.             SumNum=9;
  584.             UboundTime=5001;
  585.             initZombie('oFlagZombie');
  586.             setTimeout('SetTimeoutZombie(9,5001)',2000);
  587.             break;
  588.         case FlagZombies>=11&&FlagZombies<=13:
  589.             SumNum=4;
  590.             UboundTime=10001;
  591.             SetTimeoutZombie(SumNum,UboundTime)
  592.             break;
  593.         case FlagZombies>=14&&FlagZombies<=15:
  594.             SumNum=5;
  595.             UboundTime=10001;
  596.             SetTimeoutZombie(SumNum,UboundTime)
  597.             break;
  598.         case FlagZombies>=16&&FlagZombies<=19:
  599.             SumNum=6;
  600.             UboundTime=10001;
  601.             SetTimeoutZombie(SumNum,UboundTime)
  602.             break;
  603.         case FlagZombies==20:
  604.             SumNum=14;
  605.             UboundTime=3001;
  606.             initZombie('oFlagZombie');
  607.             aTmp=SelectFlagZombie(SumNum);
  608.             for(var n=0;n<aTmp.length-1;n++){
  609.                 setTimeout('initZombie("'+aTmp[n]+'")',Math.floor(2000+Math.random()*UboundTime));
  610.             }
  611.             setTimeout('initZombie("'+aTmp[aTmp.length-1]+'");FlagZombies=21;',Math.floor(Math.random()*UboundTime));
  612.             return(false);
  613.     }
  614.     AlreadyAddZombiesFlag=0;
  615.     RefreshZombiesTimer(0);
  616. }
  617. function SetTimeoutZombie(SumNum,UboundTime){
  618.     aTmp=SelectFlagZombie(SumNum);
  619.     initZombie(aTmp[0]);
  620.     for(var n=1;n<aTmp.length;n++){
  621.         setTimeout('initZombie("'+aTmp[n]+'")',Math.floor(Math.random()*UboundTime));
  622.     }
  623. }
  624. function fShovel(id){
  625.     //铲除植物
  626.     var ob=document.getElementById(id);
  627.     if(ob!='[object]'){return(false);}
  628.     var C=ob.C,R=ob.R;
  629.     var OPlant;
  630.     eval('OPlant='+ob.EName);
  631.     if(OPlant.isGroundPlant==1){ //容器植物
  632.         if(oGP.aPlant[C][R][0]!=''||oGP.aPlant[C][R][1]!=''){return(false);}
  633.         OPlant.Die(ob);
  634.     }else{ //非容器植物
  635.         OPlant.Die(ob);
  636.     }
  637.     CancelShovel();
  638. }
  639. function SelectShovel(id){
  640.     var ob=document.getElementById(id);
  641.     if(ob!='[object]'){return(false);}
  642.     ob.style.filter='alpha(opacity=60)';
  643. }
  644. function CancelSelectShovel(id){
  645.     var ob=document.getElementById(id);
  646.     if(ob!='[object]'){return(false);}
  647.     ob.style.filter=(ob.style.filter).replace('alpha(opacity=60)','');
  648. }
  649. dAll.onmousedown=function(){
  650.     switch(Chose){
  651.         case 1:
  652.             switch(event.button){
  653.                 case 1:
  654.                     GrowPlant(event.clientX,event.clientY);
  655.                     break;
  656.                 default:
  657.                     CancelPlant();
  658.             }
  659.             break;
  660.         case -1:
  661.             if(event.button!=1){CancelShovel()}
  662.     }
  663. }

  664. /*
  665. dAll.onmousedown=function(){
  666.     switch(Chose){
  667.         case 1:
  668.             switch(event.button){
  669.                 case 1:
  670.                     GrowPlant(event.clientX,event.clientY);
  671.                     break;
  672.                 default:
  673.                     CancelPlant();
  674.             }
  675.             break;
  676.         case -1:
  677.             switch(event.button){
  678.                 case 1:
  679.                     var C=GetC(event.clientX);
  680.                     var R=GetR(event.clientY);
  681.                     var ob,OPlant;
  682.                     if(oGP.aPlant[C][R][0]!=''){
  683.                         ob=document.getElementById(oGP.aPlant[C][R][0]);
  684.                     }else{
  685.                         if(oGP.aPlant[C][R][1]!=''){
  686.                             ob=document.getElementById(oGP.aPlant[C][R][1]);
  687.                         }else{
  688.                             if(oGP.aGroundPlant[C][R][0]!=''){
  689.                                 ob=document.getElementById(oGP.aGroundPlant[C][R][0]);
  690.                             }else{
  691.                                 if(oGP.aGroundPlant[C][R][1]!=''){ob=document.getElementById(oGP.aGroundPlant[C][R][1]);}
  692.                             }
  693.                         }
  694.                     }
  695.                     if(ob=='[object]'){
  696.                         eval('OPlant='+ob.EName);
  697.                         OPlant.Die(ob);
  698.                     }
  699.                 default:
  700.                     CancelShovel();
  701.             }
  702.             break;
  703.     }
  704. }
  705. */
  706. dAll.onmousemove=function(){
  707.     if(Chose==0){return(false);}
  708.     switch(Chose){
  709.         case 1: //种植
  710.             var ob=document.getElementById('movePlant');
  711.             var obAlpha=document.getElementById('movePlantAlpha');
  712.             var pX,pY;
  713.             var C,R;
  714.             var X=event.clientX;Y=event.clientY+document.body.scrollTop;
  715.             ob.style.pixelLeft=X-ob.width/2;
  716.             ob.style.pixelTop=Y-ob.height/2;
  717.             rX=ChosePlantX(X);rY=ChosePlantY(Y);
  718.             if(rY!=0){
  719.                 C=GetPlantC(rX);R=GetPlantR(rY);
  720.                 pX=rX-ChoseClassName.width/2;pY=rY-ChoseClassName.height;
  721.                 obAlpha.style.pixelLeft=pX;
  722.                 obAlpha.style.pixelTop=pY+ChoseClassName.GetDeviationY(C,R);
  723.                 if(CanGrow(C,R)){
  724.                     obAlpha.style.display='block';
  725.                 }else{
  726.                     obAlpha.style.display='none';
  727.                 }
  728.             }else{
  729.                 obAlpha.style.display='none';
  730.             }
  731.             break;
  732.         case -1:
  733.             var ob=document.getElementById('imgShovel');
  734.             ob.style.pixelLeft=event.clientX-30;
  735.             ob.style.pixelTop=event.clientY-50;
  736.             break;
  737.     }
  738. }

  739. function LawnMowerKill(R){
  740.     //剪草机
  741.     var ob=document.getElementById('LawnMower'+R);
  742.     var C=GetC(ob.style.pixelLeft+71);
  743.     var zombieStr=oGP.aZombie[C][R];
  744.     var n,atmp,obZombie,OZombie;
  745.     atmp=zombieStr.split(',');
  746.     for(n=0;n<atmp.length-1;n++){ //循环获得僵尸
  747.         obZombie=document.getElementById(atmp[n]); //获得僵尸对象
  748.         eval('OZombie='+obZombie.EName);
  749.         OZombie.Die(obZombie);
  750.     }
  751.     ob.style.pixelLeft+=5;
  752.     if(ob.style.pixelLeft>oGP.MaxWidth){
  753.         document.getElementById('dAll').removeChild(ob);
  754.         return(false);
  755.     }
  756.     setTimeout('LawnMowerKill('+R+')',10);
  757. }

  758. function GameOver(){
  759.     //游戏失败
  760.     var img=new Image();
  761.     img.src=dicGroundGif('ZombiesWon').src;
  762.     img.style.zIndex=100;
  763.     img.style.position='absolute';
  764.     img.style.pixelLeft=0;
  765.     img.style.pixelTop=0;
  766.     img.width=document.body.clientWidth;
  767.     img.height=document.body.clientHeight;
  768.     img.id='imgGameOver';
  769.     img.onclick=function(){RestartGame();}
  770.     document.body.appendChild(img);
  771. }

  772. //------------------------选择卡片------------------------
  773. var SelectNum=0,SelectSum=10;
  774. function SelectCard(CardID){
  775.     //选择卡片
  776.     var ob=document.getElementById('Card'+CardID);
  777.     if(ob.style.filter!='gray'){
  778.         if(SelectNum==SelectSum){return(false);}
  779.         SelectNum+=1;
  780.         var img=new Image();
  781.         img.src=ob.src;
  782.         img.id='SelectCard'+CardID;
  783.         img.EName=ob.EName;
  784.         img.CardID=CardID;
  785.         img.onclick=function(){SelectCard(CardID)}
  786.         document.getElementById('tCard'+(SelectNum-1)).appendChild(img);
  787.         ob.style.filter='gray';
  788.     }else{
  789.         SelectNum-=1;
  790.         var ob2=document.getElementById('SelectCard'+CardID);
  791.         ob2=(ob2.offsetParent);
  792.         ob2.removeChild(document.getElementById('SelectCard'+CardID));
  793.         ob.style.filter='';
  794.         SortCard();
  795.     }
  796.     if(SelectNum==SelectSum){
  797.         document.getElementById('btnOK').disabled=false;
  798.     }
  799. }
  800. function SortCard(){
  801.     //重排卡片
  802.     var n,m,ob;
  803.     var obN,obM;
  804.     for(n=1;n<SelectSum;n++){
  805.         obN=document.getElementById('tCard'+(n-1));
  806.         if(obN.childNodes.length==0){
  807.             obM=document.getElementById('tCard'+n)
  808.             if(obM.childNodes.length==0){return(false);}
  809.             ob=obM.childNodes[0];
  810.             obN.appendChild(ob);
  811.         }
  812.     }
  813.     document.getElementById('btnOK').disabled=true;
  814. }
  815. function ResetSelectCard(){
  816.     //全部重选
  817.     var n,ob,CardID;
  818.     document.getElementById('btnOK').disabled=true;
  819.     for(n=1;n<=SelectNum;n++){
  820.         obN=document.getElementById('tCard'+(n-1));
  821.         if(obN.childNodes.length>0){
  822.             ob=obN.childNodes[0];
  823.             CardID=ob.CardID;
  824.             document.getElementById('Card'+CardID).style.filter='';
  825.             obN.innerHTML='';
  826.         }
  827.     }
  828.     SelectNum=0;
  829. }
  830. function LetsGO(){
  831.     var n,obN;
  832.     for(n=1;n<=SelectNum;n++){
  833.         obN=document.getElementById('tCard'+(n-1));
  834.         ob=obN.childNodes[0];
  835.         eval('o'+ob.EName+'=new C'+ob.EName+'();');
  836.     }
  837.     document.getElementById('dZombie').innerHTML='';
  838.     document.getElementById('dSelectCard').style.display='none';
  839.     InitInterface();
  840. }
  841. function DisplayZombie(){
  842.     //X:dAll:500-750,dZombie:0-335(50-285)
  843.     //Y:dAll:200-600,dZombie:0-513(100-513)
  844.     //显示出场僵尸种类
  845.     var aZ=new Array();
  846.     var aTmp=new Array();
  847.     var n,m,aX=new Array(),aY=new Array();
  848.     var U=ArrayZombies.length;
  849.     for(n=1;n<ArrayZombies.length;n++){
  850.         for(m=0;m<ArrayZombies[n].length;m++){
  851.             aTmp.push(ArrayZombies[n][m]);
  852.         }
  853.     }
  854.     for(n=0;n<aTmp.length;n++){
  855.         aX.push(Math.floor(50+Math.random()*236));
  856.         aY.push(Math.floor(100+Math.random()*414));
  857.     }
  858.     aY=aY.sort();
  859.     var OZombie;
  860.     for(n=0;n<aTmp.length;n++){
  861.         eval('OZombie='+aTmp[n]);
  862.         var img=new Image();
  863.         img.src=OZombie.NormalGif;
  864.         img.style.position='absolute';
  865.         img.style.pixelLeft=aX[n]-OZombie.width/2;
  866.         img.style.pixelTop=aY[n]-OZombie.height;
  867.         document.getElementById('dZombie').appendChild(img);
  868.     }
  869. }

  870. function RestartGame(){
  871.     //重新开始游戏
  872.     window.location.reload();
  873.     return(true);
  874.     NumZombies=0; //僵尸数量
  875.     NoZombies=0; //第几只僵尸,用于给僵尸取ID
  876.     FlagZombies=0; //僵尸第几波
  877.     ArrayZombies=new Array('',new Array(),new Array(),new Array()) //僵尸种类的数组0不用,1,2,3分别表示不同强度的僵尸
  878.     AlreadyAddZombiesFlag=0; //标记是否已经添加了下Flag僵尸
  879.     NumSun=0; //标记阳光,用于给阳光取ID
  880.     Win=0; //标记是否胜利
  881.     Chose=0; //鼠标已经选择了某个植物,1表示选择,0表示没选
  882.     oGP.SunNum=oGP.initSunNum; //恢复阳光值
  883.     document.getElementById('tSunNum').innerText=oGP.SunNum;
  884.     var ob,n,m;
  885.     var aZom=getElementsByName('img','Zombies');
  886.     for(var n=0;n<aZom.length;n++){
  887.         ob=aZom[n];
  888.         document.getElementById('dAll').removeChild(ob);
  889.     }
  890.     var aPlant=getElementsByName('img','Plants');
  891.     for(var n=0;n<aPlant.length;n++){
  892.         ob=aPlant[n];
  893.         document.getElementById('dAll').removeChild(ob);
  894.     }
  895.     oGP.aR=new Array(0,0,0,0,0,0); //每行的僵尸数量
  896.     oGP.aP=new Array(); //二维数组,保存每个格子的原始属性,水池,草地,花盆,睡莲,屋顶,弹坑等
  897.     oGP.aPAfterGrow=new Array(); //二维数组,保存每个格子种植植物以后的属性,水池,草地,花盆,睡莲,屋顶,弹坑等
  898.     oGP.aGroundPlant=new Array(); //三维数组,保存每个格子的容器植物对象名,比如睡莲花盆地衣等,最多可以存在两种容器,比如地衣上种植花盆,目前版本暂时只有一种容器,没有地衣
  899.     oGP.aPlant=new Array(); //三维数组,保存每个格子的植物,aPlant[C][R][0]保存普通植物比如射手等,[C][R][1]保存保护性植物,比如南瓜
  900.     oGP.aZombie=new Array(); //二维数组,保存每个格子的僵尸
  901.     for(n=1;n<=oGP.MaxC;n++){
  902.         oGP.aP[n]=new Array('','[草地]','[草地]','[草地]','[草地]','[草地]');
  903.         oGP.aPAfterGrow[n]=new Array('','[草地]','[草地]','[草地]','[草地]','[草地]');
  904.         oGP.aGroundPlant[n]=new Array(6);
  905.         oGP.aPlant[n]=new Array(6);
  906.         for(m=1;m<=5;m++){
  907.             oGP.aGroundPlant[n][m]=new Array('','');
  908.             oGP.aPlant[n][m]=new Array('','');
  909.         }
  910.     }
  911.     for(n=0;n<=oGP.MaxC+2;n++){ //僵尸列数组比植物多2,僵尸初始站在最右边的11列,无法被攻击
  912.         oGP.aZombie[n]=new Array('','','','','','');
  913.     }
  914.     SelectZombie(); //初始化僵尸数组
  915.     document.getElementById('dAll').removeChild(document.getElementById('imgGameOver'));
  916.     for(n=0;n<=9;n++){
  917.         document.getElementById('tCard'+n).innerHTML='';
  918.     }
  919.     for(n=1;n<=48;n++){
  920.         ob=document.getElementById('Card'+n);
  921.         if(ob=='[object]'){ob.style.filter='';}
  922.     }
  923.     document.getElementById('btnOK').disabled=true;
  924.     SelectNum=0;
  925.     GoSelectCard();
  926. }
复制代码
华为网盘附件:
【华为网盘】 植物大战僵尸js源码带注释版本_0.rar(262.1K)
http://dl.dbank.com/c03j91uzbd

评分

参与人数 2 +2 收起 理由
yugo215 + 1 很给力!
graywolfx21 + 1

查看全部评分

发表于 2012-12-29 08:10 | 显示全部楼层
这是著名的unity版本嘛?
发表于 2014-4-20 09:52 | 显示全部楼层
学习学习!
发表于 2014-5-15 14:13 | 显示全部楼层
学习学习!
发表于 2017-2-22 18:46 | 显示全部楼层
顶顶多好
发表于 2017-2-22 19:01 | 显示全部楼层
难得一见的好帖
发表于 2017-2-22 18:35 | 显示全部楼层
很好哦
发表于 2017-2-22 19:22 | 显示全部楼层
不错不错
发表于 2017-2-22 19:09 | 显示全部楼层
LZ真是人才
发表于 2017-3-14 11:07 | 显示全部楼层
楼主是超人
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-5 23:05 , Processed in 0.072169 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表