⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamemain.cpp

📁 一个VC游戏源码,带运行程序,供大家学习之用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if(key.up)
	{
		doraemon.Y-=speed;
	}
	if(key.a)
	{
		if(doraemon.lpanimate==&dora_anim[1]||doraemon.lpanimate==&dora_anim[3])
		{
			doraemon.lpanimate=&dora_anim[3];
			if(key.a_d)
			{
				int index;
				if((index=GetEtcIndex())!=-1)
				{
					etc[index].X=doraemon.X+doraemon.width;
					etc[index].Y=doraemon.Y;
					etc[index].Xstart=doraemon.X+doraemon.width;
					etc[index].Ystart=doraemon.Y;
					etc[index].width=28;
					etc[index].height=10;
					etc[index].relation=CHARACTER_ANIMATE;
					etc[index].lpanimate=&etcanim[1];
					etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BULLET_DORAEMON_RIGHT<<16);
					etc[index].visible=1;
					etc[index].intvalue[ATP]=doraemon.intvalue[ATP]+rand()%5;
					etc[index].doublevalue[SPEED]=7;
				}
			}
		}
		else
		{
			doraemon.lpanimate=&dora_anim[2];
			if(key.a_d)
			{
				int index;
				if((index=GetEtcIndex())!=-1)
				{
					etc[index].X=doraemon.X-28;
					etc[index].Y=doraemon.Y;
					etc[index].Xstart=doraemon.X-28;
					etc[index].Ystart=doraemon.Y;
					etc[index].width=28;
					etc[index].height=10;
					etc[index].relation=CHARACTER_ANIMATE;
					etc[index].lpanimate=&etcanim[0];
					etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BULLET_DORAEMON_LEFT<<16);
					etc[index].visible=1;
					etc[index].intvalue[ATP]=doraemon.intvalue[ATP]+rand()%5;
					etc[index].doublevalue[SPEED]=7;
				}
			}
		}
	}
	else
	{
		if(doraemon.lpanimate==&dora_anim[1]||doraemon.lpanimate==&dora_anim[3])
		{
			doraemon.lpanimate=&dora_anim[1];
		}
		else
		{
			doraemon.lpanimate=&dora_anim[0];
		}
	}

	if(key.b_d&&item[ITEM_CATE]>0)
	{
		int index;
		if((index=GetEtcIndex())!=-1)
		{
			etc[index].X=doraemon.X;
			etc[index].Y=doraemon.Y-20;
			etc[index].Xstart=doraemon.X;
			etc[index].Ystart=doraemon.Y-20;
			etc[index].width=32;
			etc[index].height=10;
			etc[index].relation=CHARACTER_ANIMATE;
			etc[index].lpanimate=&etcanim[8];
			etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(ITEM_1_USE<<16);
			etc[index].visible=1;
			etc[index].intvalue[ACTION]=0;
			etc[index].doublevalue[SPEED]=2;
		}
		item[ITEM_CATE]-=1;
		doraemon.intvalue[HP]=doraemon.intvalue[HP_MAX];
	}

	//动画
	doraemon.lpanimate->frame=doraemon.intvalue[FRAME];
	if(key.down||key.up||key.right||key.left)
	{
		PlayAnimate(doraemon.lpanimate);
	}
	else
	{
		StopAnimate(doraemon.lpanimate);
	}
	doraemon.intvalue[FRAME]=doraemon.lpanimate->frame;
	doraemon.intvalue[CUR]=doraemon.lpanimate->cur;

	Xfocus=doraemon.X;
	Yfocus=doraemon.Y;
	if(Xfocus-X>WIDTH/2&&X+speed<=stage.maplength*32-WIDTH)
	{
		X+=speed;
	}
	if((Xfocus-X<WIDTH/2&&X-speed>=0)||X>stage.maplength*32-WIDTH)
	{
		X-=speed;
	}
	if(Yfocus-Y>HEIGHT/2&&Y+speed<=16*32-HEIGHT)
	{
		Y+=speed;
	}
	if((Yfocus-Y<HEIGHT/2&&Y-speed>=0)||Y>16*32-HEIGHT)
	{
		Y-=speed;
	}

	/////////////////////////////////////////////////////////////////////////////////////////////

	//画屏幕范围地图

	/////////////////////////////////////////////////////////////////////////////////////////////

	int Xmin=((int)X)/32,Xmax=(((int)X)+WIDTH)/32,Ymin=((int)Y)/32,Ymax=(((int)Y)+HEIGHT)/32,Xstart=-(((int)X)%32),Ystart=-(((int)Y)%32);
	for(i=Xmin;i<=Xmax;i++)
	{
		for(j=Ymin;j<=Ymax;j++)
		{
			SetGraphPos(&tile[stage.map[i][j]],Xstart+(i-Xmin)*32,Ystart+(j-Ymin)*32);
			GraphToBack(&tile[stage.map[i][j]]);
		}
	}

	int num=0; //统计排序对象总数
	CHARACTER* c[sizeof(stage.scenery)/sizeof(CHARACTER)+sizeof(stage.animate)/sizeof(CHARACTER)+sizeof(etc)/sizeof(CHARACTER)+1]; //用于排序的指针数组
	int clist[sizeof(stage.scenery)/sizeof(CHARACTER)+sizeof(stage.animate)/sizeof(CHARACTER)+sizeof(etc)/sizeof(CHARACTER)+1]; //用于排序序号的数组
	memset(clist,0,sizeof(clist)); //初始化排序序号为0
	for(i=0;i<sizeof(stage.scenery)/sizeof(CHARACTER);i++) //统计对象总数并定位显示位置
	{
		if(stage.scenery[i].visible)
		{
			stage.scenery[i].x=stage.scenery[i].X-X; //象幽灵一样的东西
			stage.scenery[i].y=stage.scenery[i].Y-Y;
			SetCharacterPos(&stage.scenery[i],stage.scenery[i].x,stage.scenery[i].y);
			if(Act(stage.scenery[i].lpgraph->destrect,maprect)) //仅提取满足显示需要的对象
			{
				c[num]=&stage.scenery[i]; //获得对象的指针
				num+=1;
			}
		}
	}

	for(i=0;i<sizeof(etc)/sizeof(CHARACTER);i++)
	{
		if(etc[i].visible)
		{
			switch(HIWORD(etc[i].type))
			{
			case BULLET_DORAEMON_LEFT:
				etc[i].X-=etc[i].doublevalue[SPEED];
				if(abs(etc[i].X-etc[i].Xstart)>300)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BULLET_DORAEMON_RIGHT:
				etc[i].X+=etc[i].doublevalue[SPEED];
				if(abs(etc[i].X-etc[i].Xstart)>300)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BULLET_CAT_RIGHT:
				etc[i].doublevalue[AHEAD_SPEED]+=etc[i].doublevalue[AHEAD_A];
				etc[i].X+=etc[i].doublevalue[AHEAD_SPEED];
				etc[i].doublevalue[FLOAT_SPEED]+=etc[i].doublevalue[FLOAT_A];
				etc[i].doublevalue[Z]+=etc[i].doublevalue[FLOAT_SPEED];
				if(etc[i].doublevalue[Z]>10)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BULLET_CAT_LEFT:
				etc[i].doublevalue[AHEAD_SPEED]+=etc[i].doublevalue[AHEAD_A];
				etc[i].X+=etc[i].doublevalue[AHEAD_SPEED];
				etc[i].doublevalue[FLOAT_SPEED]+=etc[i].doublevalue[FLOAT_A];
				etc[i].doublevalue[Z]+=etc[i].doublevalue[FLOAT_SPEED];
				if(etc[i].doublevalue[Z]>10)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BOWL_1:
				etc[i].X+=etc[i].doublevalue[AHEAD_SPEED];
				if(etc[i].intvalue[FRAME]+1==etc[i].lpanimate->surcount*etc[i].lpanimate->step)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BOWL_2:
				etc[i].doublevalue[FLOAT_SPEED]+=etc[i].doublevalue[FLOAT_A];
				etc[i].doublevalue[Z]+=etc[i].doublevalue[FLOAT_SPEED];
				if(etc[i].doublevalue[Z]<-500)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BULLET_HACKCAT_LEFT:
				etc[i].X-=etc[i].doublevalue[SPEED];
				if(abs(etc[i].X-etc[i].Xstart)>WIDTH*5)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BULLET_HACKCAT_RIGHT:
				etc[i].X+=etc[i].doublevalue[SPEED];
				if(abs(etc[i].X-etc[i].Xstart)>WIDTH*5)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BULLET_HACKCAT_SMALL_LEFT:
				etc[i].X-=etc[i].doublevalue[SPEED];
				if(abs(etc[i].X-etc[i].Xstart)>WIDTH)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case BULLET_HACKCAT_SMALL_RIGHT:
				etc[i].X+=etc[i].doublevalue[SPEED];
				if(abs(etc[i].X-etc[i].Xstart)>WIDTH)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case ITEM_1:
				etc[i].doublevalue[Z]-=etc[i].doublevalue[SPEED];
				if(etc[i].doublevalue[Z]<-90)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case ITEM_1_USE:
				etc[i].doublevalue[Z]-=etc[i].doublevalue[SPEED];
				if(etc[i].doublevalue[Z]<-90)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			case ITEM_2:
				etc[i].doublevalue[Z]-=etc[i].doublevalue[SPEED];
				if(etc[i].doublevalue[Z]<0)
				{
					_stprintf(strbuf,"+%d",etc[i].intvalue[SCORE]);
					DrawString(etc[i].x,etc[i].y,strbuf);
					DrawString(etc[i].x-1,etc[i].y-1,strbuf,0);
				}
				if(etc[i].doublevalue[Z]<-90)
				{
					etc[i].visible=0;
					etcnum=GetEtcUsed();
				}
				break;
			default:
				break;
			}
			etc[i].x=etc[i].X-X;
			etc[i].y=etc[i].Y-Y;
			SetCharacterPos(&etc[i],etc[i].x,etc[i].y);
			destrect=etc[i].lpanimate->graph[etc[i].intvalue[CUR]].destrect;
			if(Act(destrect,maprect))
			{
				c[num]=&etc[i];
				num+=1;
			}
			//动画
			etc[i].lpanimate->frame=etc[i].intvalue[FRAME];
			if(etc[i].intvalue[ACTION]!=0)
			{
				PlayAnimate(etc[i].lpanimate);
			}
			else
			{
				StopAnimate(etc[i].lpanimate);
			}
			etc[i].intvalue[FRAME]=etc[i].lpanimate->frame;
			etc[i].intvalue[CUR]=etc[i].lpanimate->cur;
			//毁灭
			if((HIWORD(etc[i].type)==BULLET_DORAEMON_LEFT||HIWORD(etc[i].type)==BULLET_DORAEMON_RIGHT))
			{
				for(j=0;j<sizeof(stage.animate)/sizeof(CHARACTER);j++)
				{
					if(stage.animate[j].visible&&etc[i].visible)
					{
						if(Act(etc[i].colliderect,stage.animate[j].colliderect))
						{
							int index;
							if((index=GetEtcIndex())!=-1)
							{
								etc[index].X=etc[i].X;
								etc[index].Y=etc[i].Y;
								etc[index].width=28;
								etc[index].height=10;
								etc[index].relation=CHARACTER_ANIMATE;
								etc[index].lpanimate=&etcanim[2];
								etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BOWL_1<<16);
								etc[index].intvalue[ACTION]=1;
								etc[index].doublevalue[AHEAD_SPEED]=((HIWORD(etc[i].type)==BULLET_DORAEMON_LEFT)?-2:2);
								etc[index].visible=1;
							}
							if(etc[i].intvalue[ATP]-stage.animate[j].intvalue[DEF]>0)
								stage.animate[j].intvalue[HP]-=etc[i].intvalue[ATP]-stage.animate[j].intvalue[DEF];
							if(stage.animate[j].intvalue[HP]<=0)
							{
								int k,k_max=rand()%(stage.animate[j].width*stage.animate[j].height/100)+12;
								for(k=0;k<k_max;k++)
								{
									if((index=GetEtcIndex())!=-1)
									{
										etc[index].X=stage.animate[j].X+(rand()%stage.animate[j].width-(stage.animate[j].width/2));
										etc[index].Y=stage.animate[j].Y+(rand()%stage.animate[j].height*4-(stage.animate[j].height*4/2));
										etc[index].width=28;
										etc[index].height=10;
										etc[index].relation=CHARACTER_ANIMATE;
										etc[index].lpanimate=&etcanim[2];
										etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BOWL_1<<16);
										etc[index].intvalue[ACTION]=1;
										etc[index].intvalue[FRAME]=rand()%etc[index].lpanimate->step*2;
										etc[index].doublevalue[AHEAD_SPEED]=((HIWORD(etc[i].type)==BULLET_DORAEMON_LEFT)?-2:2);
										etc[index].visible=1;
									}
								}
								stage.animate[j].visible=0;
								score+=stage.animate[j].intvalue[SCORE];

								//道具掉落-铜锣烧
								if(HIWORD(stage.animate[j].type)==0&&rand()%12==0)
								{
									if((index=GetEtcIndex())!=-1)
									{
										etc[index].X=stage.animate[j].X;
										etc[index].Y=stage.animate[j].Y;
										etc[index].width=32;
										etc[index].height=10;
										etc[index].relation=CHARACTER_ANIMATE;
										etc[index].lpanimate=&etcanim[8];
										etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(ITEM_1<<16);
										etc[index].intvalue[ACTION]=1;
										etc[index].visible=1;
									}
								}

								//道具掉落-钱币
								if(HIWORD(stage.animate[j].type)==0
									&&rand()%(15-(int)((double)doraemon.intvalue[HP]/(double)doraemon.intvalue[HP_MAX])*10)==0)
								{
									if((index=GetEtcIndex())!=-1)
									{
										etc[index].X=stage.animate[j].X;
										etc[index].Y=stage.animate[j].Y;
										etc[index].width=32;
										etc[index].height=10;
										etc[index].relation=CHARACTER_ANIMATE;
										etc[index].lpanimate=&etcanim[9];
										etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(ITEM_2<<16);
										etc[index].intvalue[ACTION]=1;
										etc[index].visible=1;
									}
								}
								enemynum=GetAnimateUsed();
							}
							etc[i].visible=0;
						}
					}
				}
			}
			if(HIWORD(etc[i].type)==BULLET_CAT_RIGHT||HIWORD(etc[i].type)==BULLET_CAT_LEFT
				||HIWORD(etc[i].type)==BULLET_HACKCAT_RIGHT||HIWORD(etc[i].type)==BULLET_HACKCAT_LEFT
				||HIWORD(etc[i].type)==BULLET_HACKCAT_SMALL_RIGHT||HIWORD(etc[i].type)==BULLET_HACKCAT_SMALL_LEFT)
			{
				if(Act(etc[i].colliderect,doraemon.colliderect)&&doraemon.visible)
				{
					int index;
					if((index=GetEtcIndex())!=-1)
					{
						etc[index].X=etc[i].X;
						etc[index].Y=etc[i].Y;
						etc[index].width=28;
						etc[index].height=10;
						etc[index].relation=CHARACTER_ANIMATE;
						etc[index].lpanimate=&etcanim[2];
						etc[index].type=MULTI_POINTER_TO_ONE_ANIMATE|(BOWL_1<<16);
						etc[index].doublevalue[AHEAD_SPEED]=
							((HIWORD(etc[i].type)==BULLET_CAT_LEFT||HIWORD(etc[i].type)==BULLET_HACKCAT_LEFT)?-2:2);
						etc[index].intvalue[ACTION]=1;
						etc[index].visible=1;
					}
					if(etc[i].intvalue[ATP]-doraemon.intvalue[DEF]>0&&Act(etc[i].colliderect,doraemon.colliderect)&&timer1==0)
						doraemon.intvalue[HP]-=etc[i].intvalue[ATP]-doraemon.intvalue[DEF]; //timer1==0表示清关计时器的状态为0才会被击中
					etc[i].visible=0;
					if(doraemon.intvalue[HP]<=0&&doraemon.visible)
					{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -