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

📄 main.cpp

📁 打飞机的游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	SetRect(&backR1, 0, 0, 640, 480);
	SetRect(&frontR1, 0,0, 640, 480);
	SetRect(&backR2, 0, 0, 150, 200);
	SetRect(&frontR2, 245,260, 395, 460);

	// 清屏后台缓冲区
	DDBLTFX	ddBltFx;
	ddBltFx.dwSize = sizeof(DDBLTFX);
	ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0));
	lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);
	
	// 将背景图象Blit到后台缓冲区
	lpDDSBack->Blt(&frontR1, lpDDSPic1, &backR1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	lpDDSBack->Blt(&frontR2, lpDDSPic7, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	
	switch (iSelectMainMenuNo)
	{
	case 1:
		SetRect(&backR3, 150, 0, 300, 50);
		SetRect(&frontR3, 245,260, 395, 310);
		break;
	case 2:
		SetRect(&backR3, 150, 50, 300, 100);
		SetRect(&frontR3, 245,310, 395, 360);
		break;
	case 3:
		SetRect(&backR3, 150, 100, 300, 150);
		SetRect(&frontR3, 245,360, 395, 410);
		break;
	case 4:
		SetRect(&backR3, 150, 150, 300, 200);
		SetRect(&frontR3, 245,410, 395, 460);
		break;
	default:
		SetRect(&backR3, 0, 0, 150, 200);
		SetRect(&frontR3, 245,260, 395, 460);
		break;
	}

	lpDDSBack->Blt(&frontR3, lpDDSPic7, &backR3, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	
	// 打印刷新率fps
	HDC hdc;
	char temp[32];
	lpDDSBack->GetDC(&hdc);
	SetBkMode(hdc, TRANSPARENT);
	SetTextColor(hdc, RGB(0,255,0)); 
	sprintf(temp, "%d 帧/秒", iFps);
	TextOut(hdc, 0, 0, temp, strlen(temp));
	lpDDSBack->ReleaseDC(hdc);

    //  换页
    while ( 1 )
    {
        ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );		// 调用换页函数
        
		if (ddrval == DD_OK )									// 成功则退出while循环
            break;
        
		if (ddrval == DDERR_SURFACELOST )						// 如果页面丢失,则恢复页面
		{
			ddrval = lpDDSPrimary->Restore(); 					// 恢复主页面
			
			if (ddrval!=DD_OK)
				break;
			
			ddrval=lpDDSPic1->Restore(); 						// 恢复离屏页面1
			
			if (ddrval!=DD_OK)
				break;
			
			ddrval=lpDDSPic7->Restore(); 						// 恢复离屏页面7
			
			if (ddrval!=DD_OK)
				break;
			
			ddrval=lpDDSPig->Restore(); 						// 恢复离屏页面pig
			
			if (ddrval!=DD_OK)
				break;
			
			if (!InitThread())
				break;					 						// 重新提取背景
		}

        if (ddrval != DDERR_WASSTILLDRAWING)
			break;
	}
}

bool FreeThread()
{
	switch (iThread)
	{
	case 0:
		if (bSoundDrive)cDSound.Stop(0);
			break;
	case 999:
		// FreeResource();
		break;
	default :
		return false;
	}

	return true;
}

void QuitOneThread()
{
	switch (iThread)
	{
	case 0:      						// info display
		FreeThread();
		cMidi.Play(hWndMain,"wav\\menu.mid");
		iThread=1;
		bInitAgain=true;
		break;
	case 1:								// menu display
		/*FreeThread();
		iThread=2;
		bInitAgain=true;
		break;
	case 2:    							// menu
		// FreeThread();
		// iThread=999;
		// bInitAgain=true;*/
		break;
	case 3:     						// let go!!
		FreeThread();
		cMidi.Stop();
		cMidi.ChangePlay("wav\\menu.mid");
		iThread=1;
		bInitAgain=true;
		break;
	case 999:   						// exit system
		cMidi.Stop();
		FreeResource();
		PostQuitMessage(0);
		break;
	default:
		FreeThread();
		iThread=0;
		bInitAgain=true;
		break;
	}
}

void LetGo()								// 游戏开始...
{
	RECT backR1, frontR1,backR2, frontR2,backR3, frontR3;
	static bool bFireLeftFlag=false;							// 
	static bool bAckFlag=false;									// 
	static int iBoosX=200,iBoosY=10;							// 
	static int iBack=1480;										// 背景位置
	int i,j;

	switch (iMoveWay)
	{
	case 4:
		if ((iFX-iFSpeed)>=0)
			iFX-=iFSpeed;
		else
			iFX=0;
		break;
	case 6:
		if ((iFX+iFSpeed)<=580)
			iFX+=iFSpeed;
		else
			iFX=580;
		break;
	case 8:
		if ((iFY-iFSpeed)>=0)
			iFY-=iFSpeed;
		else
			iFY=0;
		break;
	case 2:
		if ((iFY+iFSpeed)<=400)
			iFY+=iFSpeed;
		else
			iFY=400;
		break;
	case 5:									// 如果没有按下方向键
		if (bTimeToUp2)
		{
			bTimeToUp2=false;
		
			if (iFang>16)
				iFang-=1;					// 右返回
			
			if (iFang<16)
				iFang+=1;					// 左返回
		}
		break;
	}
	
	// 清屏后台缓冲区	不作这步将出现拖尾现象
	DDBLTFX	ddBltFx;
	ddBltFx.dwSize = sizeof(DDBLTFX);
	ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0));
	lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx);

	// 将背景图象Blit到后台缓冲区
	SetRect(&backR3, 0, iBack, 640, iBack+480);
	SetRect(&frontR3, 0, 0, 640, 480);
	iBack--;

	if (iBack<0)
		iBack=2399;
	
	if (iBack>1919)
	{
		SetRect(&backR3,0, iBack, 640, 2400);
		SetRect(&frontR3, 0, 0, 640, 2400-iBack);
		lpDDSBack->Blt(&frontR3, lpDDSPic8, &backR3, DDBLT_WAIT, NULL);
		SetRect(&backR3,0, 0, 640, 480-(2400-iBack));
		SetRect(&frontR3, 0,2400-iBack , 640, 480);
		lpDDSBack->Blt(&frontR3, lpDDSPic8, &backR3, DDBLT_WAIT, NULL);
	}
	else
	{
		lpDDSBack->Blt(&frontR3, lpDDSPic8, &backR3, DDBLT_WAIT, NULL);
	}

	static int iBoosHP=1000;	
	// if (iBoosY++>400)
	// 	iBoosY=0;
	// if (iBoosHP>800)
	// 	iBoosY++;

	if (bTimeToUp)
	{
		SetRect(&backR2, 510, 264, 524, 300);
		// if (iBoosHP<300)
		// 	iBoosY-=1;
	}
	else
		SetRect(&backR2, 533, 264, 547,300);

	for (i=0;i<2;i++)						// 两颗飞弹轨迹
	{
		if (iBomY[i]-3>=0&&bBomBI[i])
		{
			iBomY[i]-=3;
		
			if (iBomY[i]<iBoosY+50&&iBomY[i]>iBoosY&&iBomX[i]<iBoosX+90&&iBomX[i]>iBoosX+30)
			{
				iBoosHP-=5;
				bAckFlag=true;
				bBomBI[i]=false;
				cDSound.Play(false,2);
			}
		}
		else
		{
			iBoosHP+=1;
			bFireLeftFlag=!bFireLeftFlag;
			j=1;
			
			if (bFireLeftFlag)
			{
				j=0;
			}
			
			iBomX[i]=iFX+6+j*34;
			iBomY[i]=iFY+40;
			bBomBI[i]=true;
			cDSound.Play(false,4);
		}

		SetRect(&frontR2,iBomX[i],iBomY[i],iBomX[i]+14,iBomY[i]+36);
		lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
		// 飞弹
	}
	
	SetRect(&backR1, iFang*60, 0, iFang*60+60, 80);
	
	// 设置飞机样式
	SetRect(&frontR1, iFX,iFY, iFX+60, iFY+80);
	
	// 设置飞机位置
	lpDDSBack->Blt(&frontR1, lpDDSPic2, &backR1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	
	// 画出飞机
	// if (bTimeToUp)
	// 	SetRect(&backR1, 510, 286,524, 300);
	// else
	// 	SetRect(&backR1, 533, 286, 547,300);
	// SetRect(&frontR1, iFX+23,iFY+83, iFX+37, iFY+97);
	// lpDDSBack->Blt(&frontR1, lpDDSPic1, &backR1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);

	// 尾气
	SetRect(&backR2,350,390,490,460);
	SetRect(&frontR2,iBoosX,iBoosY,iBoosX+140,iBoosY+70);
	lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	// A10

	if (bAckFlag)
	{
		static int iAckDly=0;
		SetRect(&backR2, iAckDly*65, 0, (iAckDly+1)*65, 65);
		SetRect(&frontR2,iBoosX+43,iBoosY+20,iBoosX+108,iBoosY+85);
		lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);

		// 击中
		if (iAckDly<8)
			iAckDly++;
		else 
		{
			iAckDly=0;
			bAckFlag=false;
		}
	}
	
	/*
	SetRect(&backR2, 128, 450, 192, 480);
	for(i=4;i<8;i++)						// 背景在顶上流过
	{
		
		SetRect(&frontR2, 40+(i-4)*140,iBackY[i], (i-4)*140+104, iBackY[i]+30);
		lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
		
		if (bTimeToUp2_back)
			iBackY[i]+=1;
		
		if (iBackY[i]>400)iBackY[i]=0;
	}*/

	if (bTimeToUp2_back)
		bTimeToUp2_back=false;				// 标记背景已经刷新
	
	for (i=0;i<iGameBom;i++)
	{
		// 显示保护数
		SetRect(&backR2,0,290,20,305);
		SetRect(&frontR2,i*20,430,i*20+20,445);
		lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	}
	
	for (i=0;i<iGameBlood;i++)
	{
		// 显示血
		SetRect(&backR2,0,310,8,320);
		SetRect(&frontR2,i*8,445,(i+1)*8,455);
		lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	}

	for (i=0;i<iGameLife;i++)
	{
		// 显示飞机数
		SetRect(&backR2,0,260,20,292);
		SetRect(&frontR2,i*20,448,i*20+20,480);
		lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
	}
	
	if (iBoosHP>=0)
	{
		for(i=0;i<(iBoosHP/100+1);i++)
		{
			// 显示Boss
			SetRect(&backR2,0,310,8,320);
			SetRect(&frontR2,i*8+70,2,(i+1)*8+70,12);
			lpDDSBack->Blt(&frontR2, lpDDSPic1, &backR2, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
		}
	}
		
	// 打印刷新率fps
	HDC hdc;
	char temp[32];
	lpDDSBack->GetDC(&hdc);
	SetBkMode(hdc, TRANSPARENT);
	SetTextColor(hdc, RGB(0,255,0)); 
	sprintf(temp, "%d 帧/秒", iFps);
	TextOut(hdc, 560, 0, temp, strlen(temp));
		
	
	if (iBoosHP>=0)
	{
		sprintf(temp, "无敌金刚");								//  %d", iBoosHP);
	}
	else
		sprintf(temp,"要死不活 %d", iBoosHP);

	TextOut(hdc, 0, 0, temp, strlen(temp));
	
	lpDDSBack->ReleaseDC(hdc);

	//  换页
	HRESULT		ddrval;

    while ( 1 )
    {
        ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );		// 调用换页函数
        
		if (ddrval == DD_OK )									// 成功则退出while循环
            break;
        
		if (ddrval == DDERR_SURFACELOST )						// 如果页面丢失,则恢复页面
		{
			ddrval = lpDDSPrimary->Restore(); 					// 恢复主页面
		
			if (ddrval!=DD_OK)
				break;
			
			ddrval=lpDDSPic1->Restore(); 						// 恢复离屏页面1
			
			if (ddrval!=DD_OK)
				break;
			
			ddrval=lpDDSPic2->Restore(); 						// 恢复离屏页面2
			
			if (ddrval!=DD_OK)
				break;
			
			ddrval=lpDDSPic8->Restore(); 						// 恢复离屏页面8
			
			if (ddrval!=DD_OK)
				break;
			
			if (!InitThread())
				break; 											// 重新提取背景
		}

        if (ddrval != DDERR_WASSTILLDRAWING)
			break;
	}
}

⌨️ 快捷键说明

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