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

📄 fight.cpp

📁 一款C++小游戏的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	DDSCAPS               ddscaps;

	if(FAILED(DirectDrawCreate(NULL,&lpdd,NULL)))
	{
		MessageBox(hWnd,"failed in create lpdd","LPDD",NULL);
		return FALSE;
	}

	if(FAILED(lpdd->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|
		                                DDSCL_FULLSCREEN)))
    {
		MessageBox(hWnd,"failed in setcolevel","DDSCL",NULL);
		return FALSE;
	}

	if(FAILED(lpdd->SetDisplayMode(800,600,32)))
	{
		MessageBox(hWnd,"failed in set display mode","SETMODE",NULL);
		return FALSE;
	}

	ZeroMemory(&ddsd,sizeof(ddsd));
	ddsd.dwSize=sizeof(ddsd);
	ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
	ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|
		                DDSCAPS_FLIP|
						DDSCAPS_COMPLEX;
	ddsd.dwBackBufferCount=1;

	if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL)))
	{
		MessageBox(hWnd,"failed in create primary","PRIMARY",NULL);
		return FALSE;
	}

	ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
	if(FAILED(lpddsprimary->GetAttachedSurface(&ddscaps,&lpddsback)))
	{
		MessageBox(hWnd,"failed in attach","ATTACH",NULL);
		return FALSE;
	}
//	设置lpddsbackground的页面
	ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
	ddsd.dwHeight=600;
	ddsd.dwWidth=800;
	ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
	if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsbackground,NULL)))
	{
		MessageBox(hWnd ,"failed in create back ground","MAGROUND",NULL);
		return FALSE;
	}
	if(FAILED(DDReLoadBitmap(lpddsbackground,"ground.bmp")))
	{
		MessageBox(hWnd,"failed in Load GROUND","LOADGROUND",NULL);
		return FALSE;
	}
	//设置lpddsmap页面
	ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
	ddsd.dwHeight=60;
	ddsd.dwWidth=60;
	ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
	if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsmap,NULL)))
	{
		MessageBox(hWnd ,"failed in create map","MAP",NULL);
		return FALSE;
	}
	if(FAILED(DDReLoadBitmap(lpddsmap,"mpfield.bmp")))
	{
		MessageBox(hWnd,"failed in Load map","LOADMAP",NULL);
		return FALSE;
	}
    //设置lpddsflame页面
	ddsd.dwHeight=66;
	ddsd.dwWidth=528;
	ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
	if(FAILED(lpdd->CreateSurface(&ddsd,&lpddsflame,NULL)))
	{
		MessageBox(hWnd,"failed in create flame","FLAME",NULL);
		return FALSE;
	}
	if(FAILED(DDReLoadBitmap(lpddsflame,"flame.bmp")))
	{
		MessageBox(hWnd,"failed load flame","LOADFLAME",NULL);
		return FALSE;
	}
	if(FAILED(DDSetColorKey(lpddsflame,CLR_INVALID)))
	{
		MessageBox(hWnd,"failed in set color","FLAMECOLOR",NULL);
		return FALSE;
	}	 
    //设置lpddsplane(飞机)页面
    ddsd.dwWidth=50;
	ddsd.dwHeight=60;
	ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
    lpdd->CreateSurface(&ddsd,&lpddsplane[0],NULL);
    lpdd->CreateSurface(&ddsd,&lpddsplane[2],NULL);
	DDReLoadBitmap(lpddsplane[0],"plane.bmp");
	DDReLoadBitmap(lpddsplane[2],"plane2.bmp");
    DDSetColorKey(lpddsplane[0],RGB(0,0,0));
    DDSetColorKey(lpddsplane[2],RGB(0,0,0));
    
	ddsd.dwWidth=60;
	ddsd.dwHeight=50;
    lpdd->CreateSurface(&ddsd,&lpddsplane[1],NULL);
    lpdd->CreateSurface(&ddsd,&lpddsplane[3],NULL);
	DDReLoadBitmap(lpddsplane[1],"plane1.bmp");
	DDReLoadBitmap(lpddsplane[3],"plane3.bmp");
    DDSetColorKey(lpddsplane[1],RGB(0,0,0));
    DDSetColorKey(lpddsplane[3],RGB(0,0,0));
    //设置lpddsenemy(敌机)页面
	 ddsd.dwHeight=35;
	 ddsd.dwWidth=35;
	 lpdd->CreateSurface(&ddsd,&lpddsenemy[0],NULL);
     lpdd->CreateSurface(&ddsd,&lpddsenemy[1],NULL);
     lpdd->CreateSurface(&ddsd,&lpddsenemy[2],NULL);
     lpdd->CreateSurface(&ddsd,&lpddsenemy[3],NULL);

	 DDReLoadBitmap(lpddsenemy[0],"enemy.bmp");
	 DDReLoadBitmap(lpddsenemy[1],"enemy1.bmp");
	 DDReLoadBitmap(lpddsenemy[2],"enemy2.bmp");
	 DDReLoadBitmap(lpddsenemy[3],"enemy3.bmp");

	 DDSetColorKey(lpddsenemy[0],CLR_INVALID);
	 DDSetColorKey(lpddsenemy[1],CLR_INVALID);
	 DDSetColorKey(lpddsenemy[2],CLR_INVALID);
	 DDSetColorKey(lpddsenemy[3],CLR_INVALID);
     //设置lpddsfire(子弹)页面
	 ddsd.dwHeight=36;
  	 ddsd.dwWidth=14;
	 lpdd->CreateSurface(&ddsd,&lpddsfire[0],NULL);
	 lpdd->CreateSurface(&ddsd,&lpddsfire[2],NULL);
     DDReLoadBitmap(lpddsfire[0],"fire.bmp");
     DDReLoadBitmap(lpddsfire[2],"fire2.bmp");
  	 DDSetColorKey(lpddsfire[0],CLR_INVALID);
     DDSetColorKey(lpddsfire[2],CLR_INVALID);

 	 ddsd.dwHeight=14;
	 ddsd.dwWidth=36;
	 lpdd->CreateSurface(&ddsd,&lpddsfire[1],NULL);
	 lpdd->CreateSurface(&ddsd,&lpddsfire[3],NULL);
     DDReLoadBitmap(lpddsfire[1],"fire1.bmp");    
     DDReLoadBitmap(lpddsfire[3],"fire3.bmp");
  	 DDSetColorKey(lpddsfire[1],CLR_INVALID);
     DDSetColorKey(lpddsfire[3],CLR_INVALID);
     //设置lpddstree(树)页面
	 ddsd.dwHeight=30;
	 ddsd.dwWidth=30;
	 lpdd->CreateSurface(&ddsd,&lpddstree[0],NULL);
	 lpdd->CreateSurface(&ddsd,&lpddstree[1],NULL);
	 lpdd->CreateSurface(&ddsd,&lpddstree[2],NULL);

	 DDReLoadBitmap(lpddstree[0],"mptree.bmp");
	 DDReLoadBitmap(lpddstree[1],"mptree1.bmp");
	 DDReLoadBitmap(lpddstree[2],"mptree2.bmp");

	 DDSetColorKey(lpddstree[0],RGB(0,0,0));	                
	 DDSetColorKey(lpddstree[1],RGB(0,0,0));
	 DDSetColorKey(lpddstree[2],RGB(0,0,0));

	//取得当前路径
	_getcwd( apppath, sizeof(apppath));
	strcpy(openmidi, "play ");
	strcat(openmidi, apppath);
	strcat(openmidi, "\\a.mid");
	strcpy(closemidi, "close ");
	strcat(closemidi, apppath);
	strcat(closemidi, "\\a.mid");
	strcpy(stopmidi, "stop");
	strcat(stopmidi, apppath);
	strcat(stopmidi, "\\a.mid");
	//播放midi
	char buf[256];
	mciSendString(openmidi, buf, sizeof(buf), NULL);

	 return TRUE;
}
//**************************************************
//初始化飞机、树等的数据;
//**************************************************
void InitData(void)
{
   
	A11.x=400;
	A11.y=400;//初始化的飞机坐标
	A11.width=50;
	A11.height=60;
    A11.planestatus=super;
	A11.speed=4*GameSpeed;
	A11.lifenum=3;
	A11.bfire=TRUE;//不能发射子弹
	A11.direct=Aup;
	A11.bdead=TRUE;//死亡

	supertime=0;

	Amap.height=60;
	Amap.width=60;
	Amap.x=0;
	Amap.y=0;

	for(int i=0;i<cenemy;i++)
	{
		Aenemy[i].bfire=FALSE;//能发射子弹
		Aenemy[i].bdead=TRUE;//死亡
		Aenemy[i].direct=rand()%4;
		Aenemy[i].height=35;
		Aenemy[i].width=35;
		Aenemy[i].speed=2*GameSpeed;
		Aenemy[i].x=100;
		Aenemy[i].y=50;
	}
	for(i=0;i<cenemy;i++)
	{
		Aflame[i].height=66;
		Aflame[i].width=66;
		Aflame[i].x=100;
		Aflame[i].y=0;
		Aflame[i].ftps=0;
		Aflame[i].bdead=TRUE;
	}
	for(i=0;i<cenemy;i++)
	{
		Afire[i].Efire=0;
		Afire[i].height=36;
		Afire[i].width=14;
		Afire[i].bdead=TRUE;
		Afire[i].direct=Aup;
		Afire[i].speed =7*GameSpeed;
		Afire[i].type =Fplane;
		Afire[i].x=100;
		Afire[i].y=0;
	}
	for(i=0;i<ctree;i++)
	{
		Atree[i].height=30;
		Atree[i].width=30;
		Atree[i].type=rand()%3;
		Atree[i].x=rand()%570+leftblank;
		Atree[i].y=rand()%570;
	}
}
//**************************************************
//画地图:第一层画地表,第儿层画树
//**************************************************
bool DrawMap(void)
{
	if(FAILED(lpddsback->BltFast(0,0,lpddsbackground,NULL,DDBLTFAST_WAIT)))
	{
		MessageBox(hWnd,"failed blt ground",NULL,NULL);
		return FALSE;
	}

	for(int i=0;i<cmap;i++)
		for(int j=0;j<cmap;j++)
		{
			if(FAILED(lpddsback->BltFast((leftblank+i*Amap.width),
				                j*Amap.height,
								lpddsmap,NULL,DDBLTFAST_WAIT)))
			{
				MessageBox(hWnd,"failed draw map","DRAWMAP",NULL);
				return FALSE;
			}
		}
    for(i=0;i<ctree;i++)
	{
	   	if(FAILED(lpddsback->BltFast(Atree[i].x,Atree[i].y,
			               lpddstree[Atree[i].type],NULL,
						   DDBLTFAST_WAIT|
						   DDBLTFAST_SRCCOLORKEY)))
		{
			MessageBox(hWnd,"failed in draw tree","DRAWTREE",NULL);
			return FALSE;
		}
	}


	return TRUE;
}
//*************************************************
//画飞机
//*************************************************
bool DrawPlane(void)
{
	static int ot,nt,lt;//分别代表:久时间、现在时间、无敌持续时间;
	if(gamestatus==GameOver)return TRUE;
    if(A11.bdead)return TRUE;

	if(A11.y< 0 ){A11.y=0  ;}
	if(A11.y>540){A11.y=540;}
	
	if(A11.planestatus==super)
	{
		A11.bfire=TRUE;
		supertime++;

		if(supertime==80)
		{
			A11.planestatus=control;
			supertime=0;
			A11.bfire=FALSE;
		}

		nt=GetTickCount();
		if((nt-ot)>35)
		{
			ot=GetTickCount();
            if(FAILED(lpddsback->BltFast(A11.x,A11.y,
		                         lpddsplane[A11.direct],NULL,
								 DDBLTFAST_WAIT|
								 DDBLTFAST_SRCCOLORKEY)))
			{
				MessageBox(hWnd,"failed in draw plane","DRAWPLANE",NULL);
		        return FALSE;
			}
		}
	}
	else
	{
		if(FAILED(lpddsback->BltFast(A11.x,A11.y,
		                         lpddsplane[A11.direct],NULL,
								 DDBLTFAST_WAIT|
								 DDBLTFAST_SRCCOLORKEY)))
		{
			MessageBox(hWnd,"failed in draw plane","DRAWPLANE",NULL);
		    return FALSE;
		}
	}

	for(int i=0;i<A11.lifenum-1;i++)
	{
		
		if(FAILED(lpddsback->BltFast(i*50,20,
								 lpddsplane[Aup],NULL,
								 DDBLTFAST_WAIT|
								 DDBLTFAST_SRCCOLORKEY)))
		{
			MessageBox(hWnd,"failed in draw plane","DRAWPLANE",NULL);
		    return FALSE;
		}
	}

	return TRUE;
}
//**********************************************
//画敌机
//**********************************************
bool DrawEnemy(void)
{
	if(gamestatus==GameOver)return TRUE;
//    if(gamestatus==GamePass)return TRUE;
	for(int i=0;i<gamerank;i++)
	{
 		if(!Aenemy[i].bdead)
		{
			if(FAILED(lpddsback->BltFast(Aenemy[i].x,Aenemy[i].y,
			                 lpddsenemy[Aenemy[i].direct],NULL,
							 DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)))
			{
				MessageBox(hWnd,"failed in blt enemy","DRAWENEMY",NULL);
			    return FALSE;
			}
		}
	}
	int x=0;
	int y=0;
	for(i=0;i<nsorce;i++)
	{		
		if(y>15){x=1;y=0;}		
		
		if(FAILED(lpddsback->BltFast(700+x*35,(y*35+10),
	                 lpddsenemy[Aup],NULL,
					 DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)))
		{
			MessageBox(hWnd,"failed in blt enemy","DRAWENEMY",NULL);
		    return FALSE;
		}
		y++;
	}
	return TRUE;
 		
}
//************************************************************
//画子弹:
//************************************************************
bool DrawFire(void)
{
	if(gamestatus==GameOver)return TRUE;

	for(int i=0;i<cenemy;i++)
	{
		if(!Afire[i].bdead )
		{
			if(Afire[i].x<102)Afire[i].x=100;
			if(Afire[i].x>660)Afire[i].x=664;
			if(Afire[i].y<10 )Afire[i].y=0  ;
			if(Afire[i].y>560)Afire[i].y=564;

			if(FAILED(lpddsback->BltFast(Afire[i].x ,Afire[i].y,
				               lpddsfire[Afire[i].direct],NULL,
							   DDBLTFAST_WAIT|
							   DDBLTFAST_SRCCOLORKEY)))
			{
				MessageBox(hWnd,"failed in draw fire","DRAWFIRE",NULL);
				return FALSE;
			}
		}
	}
	return TRUE;
}
//************************************************************
//画爆炸效果
//************************************************************
bool DrawFlame(void)
{
    RECT srect;
	for(int i=0;i<cenemy;i++)
	{
		if(!Aflame[i].bdead)
		{
			GetRect(&srect,Aflame[i].ftps*66,0,66,66);


            if(Aflame[i].x<100){Aflame[i].x=100;}
			if(Aflame[i].x>640){Aflame[i].x=640;}
			if(Aflame[i].y<0  ){Aflame[i].y=0  ;}
			if(Aflame[i].y>530){Aflame[i].y=530;}
		
			if(FAILED(lpddsback->BltFast(Aflame[i].x,Aflame[i].y,
				                   lpddsflame,&srect,
								   DDBLTFAST_WAIT|
								   DDBLTFAST_SRCCOLORKEY)))
			{
				MessageBox(hWnd,"failed in draw flame","DRAWFLAME",NULL);
				return FALSE;
			}

			static int otime[cenemy];
			if(GetTickCount()-otime[i]>100)
			{
				otime[i]=GetTickCount();
				Aflame[i].ftps++;
				if(Aflame[i].ftps==4)
				{
					PlaySound();
				}

				if(Aflame[i].ftps==8)
				{
//					PlaySound("shot.wav",NULL,0);
	            	Aflame[i].height=66;
		            Aflame[i].width=66;
		            Aflame[i].x=100;
		            Aflame[i].y=0;
		            Aflame[i].ftps=0;
		            Aflame[i].bdead=TRUE;
				}
			}
		}
	}
	return TRUE;
}
//*******************************************************
//处理各数据的变化
//*******************************************************
void DataPro(void)
{
	if(gamestatus==GameOver)return; 
	if(A11.lifenum<=0){A11.bdead=TRUE;gamestatus=GameOver;}

	if(!A11.bdead)
	{
		if(A11.direct==Aup){A11.y-=A11.speed ;}
		if(A11.direct==Aright){A11.x+=A11.speed;}
		if(A11.direct==Adown){A11.y+=A11.speed;}
		if(A11.direct==Aleft){A11.x-=A11.speed;}
	}

	for(int i=0;i<gamerank;i++)
	{
		if(!Aenemy[i].bdead)
		{
			if(Aenemy[i].direct==Aup){Aenemy[i].y-=Aenemy[i].speed;}
			if(Aenemy[i].direct==Aright){Aenemy[i].x+=Aenemy[i].speed;}
			if(Aenemy[i].direct==Adown){Aenemy[i].y+=Aenemy[i].speed;}			
			if(Aenemy[i].direct==Aleft){Aenemy[i].x-=Aenemy[i].speed;}
		}
	}

	for( i=0;i<cenemy;i++)
	{
		if(!Afire[i].bdead)
		{
			if(Afire[i].direct==Aup){Afire[i].y-=Afire[i].speed;}
			if(Afire[i].direct==Aright){Afire[i].x+=Afire[i].speed;}
			if(Afire[i].direct==Adown){Afire[i].y+=Afire[i].speed;}
			if(Afire[i].direct==Aleft){Afire[i].x-=Afire[i].speed;}
		}
	}
}
//*****************************************************
//构造rect
//*****************************************************
void GetRect(RECT *srect,long x ,long y,long height,long width)
{
    srect->left=x;
	srect->top=y;
	srect->right=x+width;
	srect->bottom=y+height;
	return;
}
//**********************************************************
//翻转主从页面
//**********************************************************
void Flip(void)
{
	HRESULT rval;

	while (1)
	{
	rval=lpddsprimary->Flip(NULL, DDFLIP_WAIT);
	if(rval == DDERR_SURFACELOST) lpddsprimary->Restore();

⌨️ 快捷键说明

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