首页 热门资讯 植物大战僵尸序列号?植物大战僵尸

植物大战僵尸序列号?植物大战僵尸

更新时间:2024-03-29 19:43:28 分类:热门资讯 浏览:1

大家好,感谢邀请,今天来为大家分享一下植物大战僵尸序列号的问题,以及和植物大战僵尸的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

说明:因为完整动图提交后提示违规,所以这里仅截图示意。如果需要演示视频与项目素材,在评论中回复即可。

使用VS创建项目,使用空项目模板:

导入素材:在项目目录下,创建res文件夹,把解压后的素材拷贝到res目录下。

代码如下(需要逐行代码视频讲解,可回复“代码讲解“)。

#include<stdio.h>\\n#include<graphics.h>\\n#include"tools.h"\\n#include<mmsystem.h>\\n#pragmacomment(lib,"winmm.lib")\\n\\n#defineWIN_WIDTH900\\n#defineWIN_HEIGHT600\\n\\nenum{WAN_DOU,XIANG_RI_KUI,ZHI_WU_COUT};\\nIMAGEimgBg;\\nIMAGEimgBar;\\nIMAGEimgCards[ZHI_WU_COUT];\\nIMAGE*imgZhiWu[ZHI_WU_COUT][20];\\nintcurZhiWu;\\nintcurX,curY;//当前选中植物在移动过程中的坐标\\n\\nstructzhiWu{\\ninttype;//>=10:没有植物\\nintframeIndex;\\n};\\nstructzhiWumap[3][9];\\nintsunshine;\\nintsunshineTable[ZHI_WU_COUT]={100,50};\\n\\nvoidgameInit(){\\nloadimage(&imgBg,"res/bg.jpg");\\nloadimage(&imgBar,"res/bar.png");\\nsunshine=150;\\ncurZhiWu=0;\\nmemset(imgZhiWu,0,sizeof(imgZhiWu));\\nmemset(map,0,sizeof(map));\\n\\ncharname[64];\\nfor(inti=0;i<ZHI_WU_COUT;i++){\\nsprintf_s(name,sizeof(name),"res/Cards/card_%d.png",i+1);\\nloadimage(&imgCards[i],name);\\n\\nfor(intj=0;j<20;j++){\\nsprintf_s(name,sizeof(name),"res/zhiwu/%d/%d.png",i,j+1);\\nimgZhiWu[i][j]=newIMAGE;\\nloadimage(imgZhiWu[i][j],name);\\nif(imgZhiWu[i][j]->getwidth()==0){\\ndeleteimgZhiWu[i][j];\\nimgZhiWu[i][j]=NULL;\\n}\\n}\\n}\\n\\ninitgraph(WIN_WIDTH,WIN_HEIGHT,1);\\n//设置字体:\\nLOGFONTf;\\ngettextstyle(&f);//获取当前字体设置\\nf.lfHeight=30;//设置字体高度为48\\nf.lfWidth=15;\\nstrcpy(f.lfFaceName,"SegoeUIBlack");\\nf.lfQuality=ANTIALIASED_QUALITY;//设置输出效果为抗锯齿\\nsettextstyle(&f);//设置字体样式\\nsetbkmode(TRANSPARENT);\\nsetcolor(BLACK);\\n\\nmciSendString("playres/bg.mp3repeat",0,0,0);\\n}\\n\\nvoidupdateWindow(){\\nBeginBatchDraw();\\n\\nputimage(0,0,&imgBg);\\nputimagePNG(250,0,&imgBar);\\n\\nfor(inti=0;i<ZHI_WU_COUT;i++){\\nintx=338+i*64;\\ninty=6;\\nputimage(x,y,&imgCards[i]);\\n}\\n\\nif(curZhiWu>0){//绘制正在移动的植物\\nIMAGE*img=imgZhiWu[curZhiWu-1][0];\\nputimagePNG(curX-img->getwidth()*0.5,curY-img->getheight()*0.5,img);\\n}\\n\\nfor(inti=0;i<3;i++){\\nfor(intj=0;j<9;j++){\\nif(map[i][j].type>0){\\nintx=260+j*81.6;//(msg.x-260)/81.6;\\ninty=180+i*103.6+14;//(msg.y-210)/103.6;\\nintzhiWuIndex=map[i][j].type;\\nintframeIndex=map[i][j].frameIndex;\\nputimagePNG(x,y,imgZhiWu[zhiWuIndex-1][frameIndex]);\\n}\\n}\\n}\\n\\ncharscoreText[8];\\nsprintf_s(scoreText,sizeof(scoreText),"%d",sunshine);\\nouttextxy(282-10+4,50+15+2,scoreText);\\nEndBatchDraw();\\n}\\n\\nvoiduserClick(){\\nExMessagemsg;\\nstaticintstatus=0;\\nif(peekmessage(&msg)){\\nif(msg.message==WM_LBUTTONDOWN){\\nif(msg.x>338&&msg.x<338+64*ZHI_WU_COUT&&msg.y>6&&msg.y<96){\\nintindex=(msg.x-338)/64;\\nprintf("%d\\\\n",index);\\nstatus=1;\\ncurZhiWu=index+1;//1,2\\ncurX=msg.x;\\ncurY=msg.y;\\n}\\n}\\nelseif(msg.message==WM_MOUSEMOVE&&status==1){\\ncurX=msg.x;\\ncurY=msg.y;\\n}\\nelseif(msg.message==WM_LBUTTONUP&&status==1){\\nprintf("up\\\\n");\\nif(msg.x>260&&msg.y<995&&msg.y>180&&msg.y<491){\\nif(sunshine>=sunshineTable[curZhiWu-1]){\\nsunshine-=sunshineTable[curZhiWu-1];\\nintcol=(msg.x-260)/81.6;\\nintrow=(msg.y-210)/103.6;\\nprintf("[%d,%d]\\\\n",row,col);\\nif(map[row][col].type==0){\\nmap[row][col].type=curZhiWu;\\nmap[row][col].frameIndex=0;\\n}\\n}\\n}\\nstatus=0;\\ncurZhiWu=0;\\n}\\n}\\n}\\n\\nvoidupdateGame(){\\nfor(inti=0;i<3;i++){\\nfor(intj=0;j<9;j++){\\nif(map[i][j].type>0){\\nmap[i][j].frameIndex++;\\nif(imgZhiWu[map[i][j].type-1][map[i][j].frameIndex]==NULL){\\nmap[i][j].frameIndex=0;\\n}\\n}\\n}\\n}\\n}\\n\\nintmain(void){\\ngameInit();\\n\\ninttimer=0;\\nboolflag=true;\\nwhile(1){\\nuserClick();\\ntimer+=getDelay();\\nif(timer>20){\\ntimer=0;\\nflag=true;\\n}\\nif(flag){\\nflag=false;\\nupdateWindow();\\nupdateGame();\\n}\\n}\\n\\nreturn0;\\n}添加启动菜单

创建菜单界面,代码如下:

voidstartUI(){\\nIMAGEimgBg,imgMenu1,imgMenu2;\\nloadimage(&imgBg,"res/menu.png");\\nloadimage(&imgMenu1,"res/menu1.png");\\nloadimage(&imgMenu2,"res/menu2.png");\\nintflag=0;\\nwhile(1){\\nBeginBatchDraw();\\nputimage(0,0,&imgBg);\\nputimagePNG(474,75,flag?&imgMenu2:&imgMenu1);\\n\\nExMessagemsg;\\nif(peekmessage(&msg)){\\nif(msg.message==WM_LBUTTONDOWN&&\\nmsg.x>474&&msg.x<474+300&&msg.y>75&&msg.y<75+140){\\nflag=1;\\nEndBatchDraw();\\n}\\nelseif(msg.message==WM_LBUTTONUP&&flag){\\nreturn;\\n}\\n}\\nEndBatchDraw();\\n}\\n}

在main函数中调用菜单,代码如下:

intmain(void){\\ngameInit();\\nstartUI();\\ninttimer=0;\\nboolflag=true;\\nwhile(1){\\nuserClick();\\ntimer+=getDelay();\\nif(timer>20){\\ntimer=0;\\nflag=true;\\n}\\nif(flag){\\nflag=false;\\nupdateWindow();\\nupdateGame();\\n}\\n}\\n\\nreturn0;\\n}

生产阳光熟悉植物大战僵尸的同学都知道,种植植物才能消灭僵尸,但是种植植物,需要先具备一定数量的阳光值。初始的阳光值很小。有两种方式生成阳光:第一种,随机降落少量的阳光;第二种,通过种植向日葵,让向日葵自动生产阳光。我们先实现第一种方式。

定义一个结构体,来表示阳光球。因为阳光是以旋转的方式运动的,所以定义一个图片帧数组,通过循环播放图片帧来实现旋转效果。

IMAGEimgSunshineBall[29];\\nstructsunshineBall{\\nintx,y;\\nintframeIndex;\\nboolused;\\nintdestY;\\ninttimer=0;\\n};\\nstructsunshineBallballs[10];

在gameInit函数中,初始化阳光帧数组。

memset(balls,0,sizeof(balls));\\nfor(inti=0;i<29;i++){\\nsprintf_s(name,sizeof(name),"res/sunshine/%d.png",i+1);\\nloadimage(&imgSunshineBall[i],name);\\n}

创建阳光,代码如下。

voidcreateSunshine(){\\nintballMax=sizeof(balls)/sizeof(balls[0]);\\n\\nstaticintframeCount=0;\\nstaticintfre=400;\\nframeCount++;\\nif(frameCount>=fre){\\nfre=200+rand()%200;\\nframeCount=0;\\ninti;\\nfor(i=0;i<ballMax&&balls[i].used;i++);\\nif(i>=ballMax)return;\\n\\nballs[i].used=true;\\nballs[i].frameIndex=0;\\nballs[i].x=260+rand()%(905-260);\\nballs[i].y=60;\\nballs[i].destY=180+(rand()%4)*90+20;\\nballs[i].timer=0;\\n}\\n}

修改阳光的位置和帧序号,代码如下。

voidupdateSunshine(){\\nintballMax=sizeof(balls)/sizeof(balls[0]);\\n\\nfor(inti=0;i<ballMax;i++){\\nif(balls[i].used){\\nballs[i].frameIndex=(balls[i].frameIndex+1)%29;\\nif(balls[i].timer==0)balls[i].y+=2;\\nif(balls[i].y>=balls[i].destY){\\nballs[i].timer++;\\nif(balls[i].timer>100)balls[i].used=false;\\n}\\n}\\n}\\n}

在updateGame函数中调用以上两个函数,以创建阳光并更新阳光的状态。

createSunshine();\\nupdateSunshine();

在updateWindow函数中,渲染阳光。

for(inti=0;i<10;i++){\\nif(balls[i].used){\\nputimagePNG(balls[i].x,balls[i].y,&imgSunshineBall[balls[i].frameIndex]);\\n}\\n}收集阳光

当“阳光球”出现的时候,用户点击阳光球,就可以“收集”这个阳光,当前总的阳光值就会增加25点。在原版的植物大战僵尸游戏中,阳光球被收集后,会慢慢移动到顶部的“工具栏”的左侧。这个阳光球的“移动过程”,我们后续再实现。

定义一个全局变量,表示当前总的阳光值。

intsunshine;

在初始化gameInit中,设置一个初始值。

sunshine=150;

创建收集阳光的函数,如下:

voidcollectSunshine(ExMessage*msg){\\nintcount=sizeof(balls)/sizeof(balls[0]);\\nintw=imgSunshineBall[0].getwidth();\\ninth=imgSunshineBall[0].getheight();\\nfor(inti=0;i<count;i++){\\nif(balls[i].used){\\nintx=balls[i].x;\\ninty=balls[i].y;\\nif(msg->x>x&&msg->x<x+w&&msg->y>y&&msg->y<y+h){\\nballs[i].used=false;\\nsunshine+=25;\\nmciSendString("playres/sunshine.mp3",0,0,0);\\n}\\n}\\n}\\n}

在用户点击处理中,调用收集阳光的函数。

#include<mmsystem.h>\\n#pragmacomment(lib,"winmm.lib")\\n\\nvoiduserClick(){\\nExMessagemsg;\\nstaticintstatus=0;\\nif(peekmessage(&msg)){\\nif(msg.message==WM_LBUTTONDOWN){\\nif(msg.x>338&&msg.x<338+65*ZHI_WU_COUNT&&msg.y<96){\\nintindex=(msg.x-338)/65;\\nstatus=1;\\ncurZhiWu=index+1;\\n}else{\\ncollectSunshine(&msg);\\n}\\n}\\n//......\\n}\\n}显示当前总的阳光值

在gameInit初始化中,设置字体。

LOGFONTf;\\ngettextstyle(&f);//获取当前字体设置\\nf.lfHeight=30;//设置字体高度为48\\nf.lfWidth=15;\\nstrcpy(f.lfFaceName,"SegoeUIBlack");\\nf.lfQuality=ANTIALIASED_QUALITY;//设置输出效果为抗锯齿\\nsettextstyle(&f);//设置字体样式\\nsetbkmode(TRANSPARENT);\\nsetcolor(BLACK);

在updateWindow中绘制阳光值。

charscoreText[8];\\nsprintf_s(scoreText,sizeof(scoreText),"%d",sunshine);\\nouttextxy(276,67,scoreText);创建僵尸

创建僵尸的数据模型。这里一共创建了10个僵尸,这10个僵尸全部被消灭后,这个关卡就胜利了。

\\nstructzm{\\nintx,y;\\nintframeIndex;\\nboolused;\\nintspeed;\\n};\\nstructzmzms[10];\\nIMAGEimgZM[22];

僵尸数组,以及僵尸序列帧图片数组,在gameInit函数中进行初始化,如下。(注意:把僵尸的素材图片保存到src/zm目录下。)

memset(zms,0,sizeof(zms));\\nsrand(time(NULL));\\n\\nfor(inti=0;i<22;i++){\\nsprintf_s(name,sizeof(name),"res/zm/%d.png",i+1);\\nloadimage(&imgZM[i],name);\\n}

创建僵尸,代码如下:

voidcreateZM(){\\nstaticintzmFre=500;\\nstaticintcount=0;\\ncount++;\\nif(count>zmFre){\\nzmFre=rand()%200+300;\\ncount=0;\\n\\ninti;\\nintzmMax=sizeof(zms)/sizeof(zms[0]);\\nfor(i=0;i<zmMax&&zms[i].used;i++);\\nif(i<zmMax){\\nzms[i].used=true;\\nzms[i].x=WIN_WIDTH;\\nzms[i].y=180+(1+rand()%3)*100-8;\\nzms[i].speed=1;\\n}\\n}\\n}

更新僵尸的数据(僵尸的图片帧序号、僵尸的位置),代码如下:

voidupdateZM(){\\nintzmMax=sizeof(zms)/sizeof(zms[0]);\\n\\nstaticintcount1=0;\\ncount1++;\\nif(count1>2){\\ncount1=0;\\nfor(inti=0;i<zmMax;i++){\\nif(zms[i].used){\\nzms[i].x-=zms[i].speed;\\nif(zms->x<236-66){\\nprintf("GAMEOVER!\\\\n");\\nMessageBox(NULL,"over","over",0);//TODO\\nbreak;\\n}\\n}\\n}\\n}\\n\\nstaticintcount2=0;\\ncount2++;\\nif(count2>4){\\ncount2=0;\\nfor(inti=0;i<zmMax;i++){\\nif(zms[i].used){\\nzms[i].frameIndex=(zms[i].frameIndex+1)%22;\\n}\\n}\\n}\\n}

在updateGame函数中,创建僵尸并更新僵尸数据,如下

createZM();\\nupdateZM();

创建绘制僵尸的接口,如下:

voiddrawZM(){\\nintzmCount=sizeof(zms)/sizeof(zms[0]);\\nfor(inti=0;i<zmCount;i++){\\nif(zms[i].used){\\nIMAGE*img=&imgZM[zms[i].frameIndex];\\nintx=zms[i].x;\\ninty=zms[i].y-img->getheight();\\nputimagePNG(x,y,img);\\n}\\n}\\n}

在updateWindow函数中,绘制僵尸,如下:

drawZM();实现阳光球的飞跃

现在的实现效果是,阳光被点击后,阳光球直接消失了!而原版的植物大战僵尸中,阳光被点击后,阳光会自动飞向左上角的位置,飞到终点后,阳光值才增加25点。我们的实现方式是,阳光球每次飞跃4个点,直到飞到终点,如下图:

给阳光的结构体添加两个成员,表示飞跃过程中的偏移量:

structsunshineBall{\\nintx,y;\\nintframeIndex;\\nboolused;\\nintdestY;\\ninttimer;\\n\\n//添加以下两个成员\\nfloatxOff;\\nfloatyOff;\\n};

在阳光被创建时,把变异量设置为0,如下:

voidcreateSunshine(){\\nintballMax=sizeof(balls)/sizeof(balls[0]);\\nstaticintframeCount=0;\\nstaticintfre=200;\\nframeCount++;\\nif(frameCount>=fre){\\n//...略\\nballs[i].xOff=0;\\nballs[i].yOff=0;\\n}\\n\\n}

阳光被点击后,马上修改阳光球的xoff和yoff:

#include<math.h>\\n\\nvoidcollectSunshine(ExMessage*msg){\\nintcount=sizeof(balls)/sizeof(balls[0]);\\nintw=imgSunshineBall[0].getwidth();\\ninth=imgSunshineBall[0].getheight();\\nfor(inti=0;i<count;i++){\\nif(balls[i].used){\\nintx=balls[i].x;\\ninty=balls[i].y;\\nif(msg->x>x&&msg->x<x+w&&\\nmsg->y>y&&msg->y<y+h){\\nballs[i].used=false;\\nsunshine+=25;\\nmciSendString("playres/sunshine.mp3",0,0,0);\\n\\n//设置初始偏移量\\nfloatdestX=262;\\nfloatdestY=0;\\nfloatangle=atan((y-destY)/(x-destX));\\nballs[i].xOff=4*cos(angle);\\nballs[i].yOff=4*sin(angle);\\n}\\n}\\n}\\n}

在阳光飞跃过程中更新阳光的位置,如下:(注意是在飞跃过程中,不断计算偏移量,效果更好。)

voidupdateSunshine(){\\nintballMax=sizeof(balls)/sizeof(balls[0]);\\nfor(inti=0;i<ballMax;i++){\\nif(balls[i].used){\\n//略...\\n}\\nelseif(balls[i].xOff){\\nfloatdestX=263;\\nfloatdestY=0;\\nfloatangle=atan((balls[i].y-destY)/(balls[i].x-destX));\\nballs[i].xOff=4*cos(angle);\\nballs[i].yOff=4*sin(angle);\\n\\nballs[i].x-=balls[i].xOff;\\nballs[i].y-=balls[i].yOff;\\nif(balls[i].y<0||balls[i].x<262){\\nballs[i].xOff=0;\\nballs[i].yOff=0;\\nsunshine+=25;\\n}\\n}\\n}\\n}

删除原来被点击后,立即更新阳光值的代码。

//sunshine+=25;

修改渲染阳光的判断条件,如下:

for(inti=0;i<ballMax;i++){\\nif(balls[i].used\\n||balls[i].xOff){//添加这个条件\\nIMAGE*img=&imgSunshineBall[balls[i].frameIndex];\\nputimagePNG(balls[i].x,balls[i].y,img);\\n}\\n}

此时已经能够实现阳光的飞跃了,但是飞跃动作太慢了,后期我们再优化。

僵尸靠近时,已经种植的植物豌豆就会自动发射“子弹”,我们先为子弹定义数据类型,如下:

structbullet{\\nintx,y;\\nintrow;\\nboolused;\\nintspeed;\\n};\\nstructbulletbullets[30];\\nIMAGEimgBulletNormal;

在gameInit函数中,初始化“豌豆子弹池”和子弹的图片,如下:

loadimage(&imgBulletNormal,"res/bullets/bullet_normal.png");\\nmemset(bullets,0,sizeof(bullets));

在僵尸结构体中,添加成员row,表示该僵尸所在的“行”,方便后续的判断。也可以不加,直接根据僵尸的y坐标来计算。

structzm{\\nintx,y;\\nintframeIndex;\\nboolused;\\nintspeed;\\n\\nintrow;//0..2\\n};

在createZM函数中,创建僵尸的时候,设置row成员的值,如下:

......\\nif(i<zmMax){\\nzms[i].used=true;\\nzms[i].x=WIN_WIDTH;\\n\\nzms[i].row=rand()%3;//0..2;\\nzms[i].y=172+(1+zms[i].row)*100;\\n\\nzms[i].speed=1;\\n}\\n......

创建shoot函数,实现豌豆发射子弹,如下:

voidshoot(){\\nintzmCount=sizeof(zms)/sizeof(zms[0]);\\nintdirections[3]={0};\\nintdangerX=WIN_WIDTH-imgZM[0].getwidth();\\nfor(inti=0;i<zmCount;i++){\\nif(zms[i].used&&zms[i].x<dangerX){\\ndirections[zms[i].row]=1;\\n}\\n}\\n\\nfor(inti=0;i<3;i++){\\nfor(intj=0;j<9;j++){\\nif(map[i][j].type==WAN_DOU+1&&directions[i]){\\nstaticintcount=0;\\ncount++;\\nif(count>20){\\ncount=0;\\nintk;\\nintmaxCount=sizeof(bullets)/sizeof(bullets[0]);\\nfor(k=0;k<maxCount&&bullets[k].used;k++);\\nif(k<maxCount){\\nbullets[k].row=i;\\nbullets[k].speed=4;\\nbullets[k].used=true;\\n\\nintzwX=260+j*81.6;//(msg.x-260)/81.6;\\nintzwY=180+i*103.6+14;//(msg.y-210)/103.6;\\n\\nbullets[k].x=zwX+imgZhiWu[map[i][j].type-1][0]->getwidth()-10;\\nbullets[k].y=zwY+5;\\n}\\n}\\n}\\n}\\n}\\n}

更新子弹的位置,如下:

voidupdateBullets(){\\nintcountMax=sizeof(bullets)/sizeof(bullets[0]);\\nfor(inti=0;i<countMax;i++){\\nif(bullets[i].used){\\nbullets[i].x+=bullets[i].speed;\\nif(bullets[i].x>WIN_WIDTH){\\nbullets[i].used=false;\\n}\\n}\\n}\\n}

在updateGame函数中,发射子弹并更新子弹的位置,如下:

shoot();\\nupdateBullets();

在updateWindow中绘制子弹,如下:

intbulletMax=sizeof(bullets)/sizeof(bullets[0]);\\nfor(inti=0;i<bulletMax;i++){\\nif(bullets[i].used){\\nputimagePNG(bullets[i].x,bullets[i].y,&imgBulletNormal);\\n}\\n}子弹和僵尸的碰撞

子弹碰到僵尸之后,子弹会“爆炸”,同时僵尸会“掉血”。我们先给僵尸添加血量成员。

structzm{\\n//略...\\nintblood;\\n};

并在创建僵尸的时候,把血量初始化为100,如下:

//...\\nzms[i].speed=1;\\nzms[i].blood=100;

子弹在碰到僵尸之后才会爆炸,并显示爆炸图片:

所以,我们在子弹的结构体中添加两个成员,分别表示当前是否已经爆炸,以及爆炸的帧图片序号,如下

structbullet{\\n//...\\nboolblast;\\nintframeIndex;\\n};\\nIMAGEimgBulletBlast[4];

在gameInit函数中对子弹帧图片数组,进行初始化,如下:

loadimage(&imgBulletBlast[3],"res/bullets/bullet_blast.png");\\nfor(inti=0;i<3;i++){\\nfloatk=(i+1)*0.2;\\nloadimage(&imgBulletBlast[i],"res/bullets/bullet_blast.png",\\nimgBulletBlast[3].getwidth()*k,\\nimgBulletBlast[3].getheight()*k,true);\\n}

在发射子弹shoot函数中,对子弹的blast和帧序号frameIndex进行初始化,如下:

bullets[k].row=i;\\nbullets[k].speed=4;\\nbullets[k].used=true;\\n\\nbullets[k].blast=false;\\nbullets[k].blastTime=0;

在更新子弹的updateBullets函数中,更新子弹爆炸的帧序号,如下:

bullets[i].x+=bullets[i].speed;\\nif(bullets[i].x>WIN_WIDTH){\\nbullets[i].used=false;\\n}\\n\\nif(bullets[i].blast){\\nbullets[i].blastTime++;\\nif(bullets[i].blastTime>=4){\\nbullets[i].used=false;\\n}\\n}

进行碰撞检测,检查子弹和僵尸是否发生碰撞,如下:

voidcollisionCheck(){\\nintbCount=sizeof(bullets)/sizeof(bullets[0]);\\nintzCount=sizeof(zms)/sizeof(zms[0]);\\nfor(inti=0;i<bCount;i++){\\nif(bullets[i].used==false||bullets[i].blast)continue;\\nfor(intk=0;k<zCount;k++){\\nintx1=zms[k].x+80;\\nintx2=zms[k].x+110;\\nif(bullets[i].row==zms[k].row&&bullets[i].x>x1&&bullets[i].x<x2){\\nzms[i].blood-=20;\\nbullets[i].blast=true;\\nbullets[i].speed=0;\\n}\\n}\\n\\n}\\n}

在updateGame函数中,调用碰撞检测函数,如下:

collisionCheck();

渲染子弹的爆炸效果,如下:

intbulletMax=sizeof(bullets)/sizeof(bullets[0]);\\nfor(inti=0;i<bulletMax;i++){\\nif(bullets[i].used){\\nif(bullets[i].blast){\\nIMAGE*img=&imgBulletBlast[bullets[i].blastTime];\\nintx=bullets[i].x+12-img->getwidth()/2;\\ninty=bullets[i].y+12-img->getheight()/2;\\nputimagePNG(x,y,img);\\n\\n/*bullets[i].used=false;*/\\n}\\nelse{\\nputimagePNG(bullets[i].x,bullets[i].y,&imgBulletNormal);\\n}\\n\\n}\\n}僵尸死亡

僵尸被豌豆子弹击中后,会“掉血”,血量掉光了,就直接KO了,同时变成一堆“黑沙”。

给僵尸结构体添加dead成员,表示是否已经死亡,另外添加一个图片帧数组,用来表示变成成黑沙的过程。

structzm{\\n......\\nbooldead;\\n};\\nIMAGEimgZmDead[20];

在gameInit中对这个图片帧数组进行初始化。

for(inti=0;i<20;i++){\\nsprintf_s(name,sizeof(name),"res/zm_dead/%d.png",i+1);\\nloadimage(&imgZmDead[i],name);\\n}

在碰撞检测中对僵尸的血量做检测,如果血量降到0,就设置为死亡状态。如下:

voidcollisionCheck(){\\nintbCount=sizeof(bullets)/sizeof(bullets[0]);\\nintzCount=sizeof(zms)/sizeof(zms[0]);\\nfor(inti=0;i<bCount;i++){\\nif(bullets[i].used==false||bullets[i].blast)continue;\\nfor(intk=0;k<zCount;k++){\\nintx1=zms[k].x+80;\\nintx2=zms[k].x+110;\\nif(zms[k].dead==false&&//添加这个条件\\nbullets[i].row==zms[k].row&&bullets[i].x>x1&&bullets[i].x<x2){\\nzms[k].blood-=20;\\nbullets[i].blast=true;\\nbullets[i].speed=0;\\n\\n//对血量进行检测\\nif(zms[k].blood<=0){\\nzms[k].dead=true;\\nzms[k].speed=0;\\nzms[k].frameIndex=0;\\n}\\nbreak;\\n}\\n}\\n}\\n}

僵尸死亡后,在updateZM中,更新僵尸的状态(变成黑沙发)。如下:

staticintcount2=0;\\ncount2++;\\nif(count2>4){\\ncount2=0;\\nfor(inti=0;i<zmMax;i++){\\nif(zms[i].used){\\n//判断是否已经死亡\\nif(zms[i].dead){\\nzms[i].frameIndex++;\\nif(zms[i].frameIndex>=20){\\nzms[i].used=false;\\n}\\n}\\nelse{\\nzms[i].frameIndex=(zms[i].frameIndex+1)%22;\\n}\\n}\\n}\\n}

绘制僵尸的黑沙状态,如下:

voiddrawZM(){\\nintzmCount=sizeof(zms)/sizeof(zms[0]);\\nfor(inti=0;i<zmCount;i++){\\nif(zms[i].used){\\n//选择对应的渲染图片\\nIMAGE*img=(zms[i].dead)?imgZmDead:imgZM;\\nimg+=zms[i].frameIndex;\\n\\nintx=zms[i].x;\\ninty=zms[i].y-img->getheight();\\nputimagePNG(x,y,img);\\n}\\n}\\n}

来源:https://blog.csdn.net/weixin_55751709/article/details/129060938

OK,关于植物大战僵尸序列号和植物大战僵尸的内容到此结束了,希望对大家有所帮助。

版权声明: 本站内容部分来源网络,版权归作者所有,如有侵权,请联系我们删除!
相关文章
植物大战僵尸捕手怎么打(植物大战僵尸捕手怎么打) 游戏攻略
植物大战僵尸捕手是一款非常受欢迎的塔防游戏,巧妙地结合了植物和僵尸两种完全不同的元素。玩家需要使用各种植物来抵抗僵尸的攻击并保卫自己的院子。我们将围绕“如何打败植物大战僵尸捕手”的主题进行科普。 如何选择合适的植物 在植物大战僵尸捕手中,不同的植物有不同的特殊能力。玩家需要根据僵尸的特性以及自己的策略来选择合适的植物。向日葵可以为你提供阳光资源,豌豆射手可以远距离攻击僵尸,坚果墙可以起到防御作用等…
cw228 2024-04-02 12:56:44
植物大战僵尸怎么搞外挂(玩植物大战僵尸怎么开挂) 游戏攻略
植物大战僵尸是一款非常流行的塔防游戏,玩家需要种植植物来防御来袭的僵尸。为了在游戏中获得更高的分数,一些玩家会使用外挂软件来获得无限金币、无敌等优势。在这篇科普文章中,我们将讨论如何进行作弊及其影响。 什么是植物大战僵尸外挂 植物大战僵尸秘籍用于通过使用第三方软件或修改游戏文件在游戏中获得不公平的优势。这些优势可以包括无限金币、无限生命、无敌等。插件可以更改游戏的代码和机制以满足玩家的需求。 如何…
cw228 2024-04-02 12:56:31
要怎么玩植物大战僵尸(怎么玩植物大战僵尸小游戏) 游戏攻略
如何玩植物大战僵尸 植物大战僵尸是一款深受玩家喜爱的经典塔防游戏。如果你想成功地玩这个游戏,你需要采取一定的策略和技巧。以下是有关如何玩《植物大战僵尸》的一些重要事实。 植物大战僵尸是什么样的游戏 植物大战僵尸是一款塔防游戏。玩家需要使用不同种类的植物来抵御僵尸的不断攻击。通过在特定位置种植植物并利用它们的特殊能力击败僵尸来保护您的花园。游戏难度逐渐升级,需要玩家合理安排,运用策略来获胜。 有哪些…
cw228 2024-04-02 12:56:23
梦幻西游怎么扎鱼(梦幻补鱼) 游戏攻略
梦幻西游是一款深受玩家喜爱的角色扮演游戏。游戏中的钓鱼活动可以让玩家在游戏中体验钓鱼的乐趣。下面我们来详细了解一下梦幻西游中如何钓鱼。 梦幻西游怎么扎鱼 梦幻西游中,钓鱼功能可以让玩家到水里进行钓鱼活动。玩家需要找到水地图,可以通过游戏地图或者任务指南找到。一旦进入水中地图,玩家就可以看到水中各种各样的鱼群,不同种类的鱼出现在不同的地图中。玩家可以通过点击鱼群来钓鱼。 扎鱼的操作步骤是什么 钓鱼的…
cw228 2024-04-02 12:56:16
flappy bird下载,一夜爆红的奇葩手游 热门资讯
各位老铁们,大家好,今天由我来为大家分享flappy bird下载,以及一夜爆红的奇葩手游的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!1、“这个游戏实在是太反人类了,太丧心病狂了,太虐心了!可是我还是想玩,根本停不下来啊啊啊!”(抓狂地念)2、到底是怎样的游戏让玩家们如此抓狂?从2013年11月到2014年2月…
zz 2024-04-02 12:56:09
怎么得钻石植物大战僵尸二(植物大战僵尸二怎么获得钻石) 游戏攻略
植物大战僵尸2钻石获取方法 钻石植物大战僵尸2是一款非常流行的策略塔防游戏。融合了刺激的战斗场景和有趣的植物角色,吸引了大量玩家。对于刚接触游戏的新手来说,了解如何获得钻石非常重要。以下是有关如何获取钻石的一些问题和解答。 怎么得到钻石植物大战僵尸二中的钻石 获得钻石的方法有多种。完成游戏中的任务即可获得钻石奖励。每个任务都会给你一定数量的钻石作为奖励,根据任务的难度和完成情况你可以获得不同数量的…
cw228 2024-04-02 12:56:08
梦幻西游点卡怎么开卡包(梦幻西游点卡在哪里买便宜) 游戏攻略
梦幻西游是一款深受玩家喜爱的网络游戏。玩家需要购买点卡才能获得游戏中的虚拟物品和服务。许多人仍然对如何打开卡包有疑问。在这篇科普文章中,我们将详细介绍如何打开梦幻西游点卡的卡包。 什么是梦幻西游点卡 梦幻西游点卡是充值卡。玩家可以使用点卡购买游戏内虚拟货币和道具,提升游戏体验。点卡通常有不同面额,玩家可以根据自己的需要购买不同面额的点卡。 怎样开卡包 打开卡包的方法非常简单。您需要购买梦幻西游积分…
cw228 2024-04-02 12:55:59
植物大战僵尸名字怎么做(植物大战僵尸名字怎么做好看) 游戏攻略
如何在植物大战僵尸中出名 植物大战僵尸是一款非常受欢迎的游戏,融合了植物种植和战斗的元素,给玩家带来乐趣和挑战。为了让游戏更加有趣,植物和僵尸都有自己独特的名字。植物大战僵尸的名字是怎么起的?下面我们回答一些常见问题。 植物大战僵尸的名字是如何设计的 植物大战僵尸的命名团队主要考虑了植物和僵尸的特点,以及游戏的整体风格。他们寻找与植物和僵尸相关的词语,并结合游戏中植物和僵尸的特点进行创意设计。他们…
cw228 2024-04-02 12:55:51
梦幻西游2怎么买五开号(梦幻西游2怎么买五开号的) 游戏攻略
梦幻西游2是一款深受玩家喜爱的网络游戏。在游戏中拥有五位数的号码可以带来很多便利和乐趣。很多玩家不知道如何购买五位数号码,所以在这篇科普文章中,我们将详细介绍如何购买梦幻西游2中的五位数号码。 梦幻西游2怎么买五开号 有多种方法可以购买五位数号码。您可以通过游戏内交易系统找到其他玩家出售的五位数号码。您可以通过游戏论坛或社交媒体平台找到专门的五开号交易平台或个人。您可以选择找专业的游戏代练公司购买…
cw228 2024-04-02 12:55:43
植物大战僵尸娃娃打架怎么打,植物大战僵尸小娃娃 游戏攻略
植物大战僵尸是一款非常流行的塔防游戏。它的主要玩法是植物对抗僵尸,保卫家园。玩家需要使用不同的植物来抵御不同类型的僵尸,每种植物都有不同的特性和能力。植物大战僵尸中如何与人偶战斗?我们将回答与此问题相关的一些问题。 在植物大战僵尸中,植物和僵尸之间是如何进行打斗的 植物和僵尸之间的战斗是通过互相攻击来实现的。植物有不同的攻击方式,比如射击豌豆、放置炮塔等,而僵尸会攻击植物并试图破坏植物的防御。玩家…
cw228 2024-04-02 12:55:28