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

📄 main.cpp

📁 打飞机的游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:

    // 创建DirectDraw对象
	ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
    
	if (ddrval != DD_OK )
        return FALSE;

	// 取得全屏独占模式
    ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
    
	if (ddrval != DD_OK )
        return FALSE;

	// 设置显示器显示模式为640x480x256(8bit)色
    ddrval = lpDD->SetDisplayMode( 640, 480, 16);
    
	if (ddrval != DD_OK )
        return FALSE;

	// 填充换页链结构
    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
                          DDSCAPS_FLIP |
                          DDSCAPS_COMPLEX;
	// 指定后台缓冲区数量为1
    ddsd.dwBackBufferCount = 1;

	// 创建换页链,包括了主页面及其后台缓冲区
    ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
    
	if (ddrval != DD_OK )
        return FALSE;

	// 获得指向后台缓冲区的页面指针
	ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
    
	if (ddrval != DD_OK )
        return FALSE;

	// 创建与主页面等大小的两个离屏页面
	ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    
	ddsd.dwWidth = 640;
    ddsd.dwHeight = 480;

    if (lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) != DD_OK)
		return FALSE;
    
	ddsd.dwWidth = 1980;
    ddsd.dwHeight = 320;					// 60X80 x(16+1+16) X 4
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic2, NULL) != DD_OK)
		return FALSE;
	
	ddsd.dwWidth=340;
	ddsd.dwHeight=200;						// 创建辅助离屏页面
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic3, NULL) != DD_OK)
		return FALSE;
	
	ddsd.dwWidth=220;
	ddsd.dwHeight=480;						// 创建辅助离屏页面
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic4, NULL) != DD_OK)
		return FALSE;
	
	ddsd.dwWidth=220;
	ddsd.dwHeight=480;						// 创建辅助离屏页面
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic5, NULL) != DD_OK)
		return FALSE;
	
	ddsd.dwWidth=200;
	ddsd.dwHeight=480;						// 创建辅助离屏页面
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic6, NULL) != DD_OK)
		return FALSE;
	
	ddsd.dwWidth=300;
	ddsd.dwHeight=200;						// 创建辅助离屏页面
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic7, NULL) != DD_OK)
		return FALSE;
	
	ddsd.dwWidth=640;
	ddsd.dwHeight=2400;						// 创建辅助离屏页面
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPic8, NULL) != DD_OK)
		return FALSE;
	
	ddsd.dwWidth=100;
	ddsd.dwHeight=200;						// 创建辅助离屏页面
	
	if (lpDD->CreateSurface(&ddsd, &lpDDSPig, NULL) != DD_OK)
		return FALSE;

    // 从磁盘文件或者资源中载入调色板
	lpDDPal = DDLoadPalette(lpDD, "IDB_TITLE");
	
	// 将调色板设置给主页面
    if (lpDDPal)
        lpDDSPrimary->SetPalette( lpDDPal );
	
	// 初始化音频设备
	if (cDSound.Init(hWndMain))bSoundDrive=true;
	
	// 调用页面初始化函数
	
	// if (!InitThread() )
    //     return FALSE;
    
	return TRUE;
}

// ******************************************************************
// 函数:WinMain()
// 功能:应用程序入口
// ******************************************************************
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow)
{
    MSG         msg;
	hInst=hInstance;

	// 初始化主窗口
	if (!InitWindow( hInstance, nCmdShow))
			return FALSE;

	// 初始化DirectDraw环境
	if (!InitDDraw())
	{
		MessageBox(hWndMain, "初始化DirectDraw过程中出错!", "Error", MB_OK);
		FreeResource();  								// 释放资源
		DestroyWindow(hWndMain);
		return FALSE;
	}

	SetTimer(hWndMain,1,100,NULL);						// 动画切换计时器
	SetTimer(hWndMain,2,20,NULL);						// 动画切换计时器2
	
	// 进入消息循环
	while (1)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if (!GetMessage(&msg, NULL, 0, 0 ))
				return msg.wParam;
			
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if (bActive)						// 程序处于激活状态
		{
			MainLoop();
		}
		else WaitMessage();						// 否则等待
	}

    // return msg.wParam;
} 

// ******************************************************************
// 函数:InitTitle()
// 功能:初始化页面图象
// ******************************************************************
BOOL InitThread( void )
{
	bInitAgain=false;
	HBITMAP hbm;

	switch (iThread)
	{
	case 0:										// 序
		ShowCursor(FALSE);   					// 隐藏光标

		if (bSoundDrive)
		{
			cDSound.SetTrack("wav\\info.wav",0);
			// cDSound.SetTrack("wav\\di1.wav",1);
			cDSound.Play(false,0);
		}

		hbm = (HBITMAP)LoadImage(hInst, "IDB_TITLE", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
		
		if (hbm == NULL)
			return FALSE;
		
		DDCopyBitmap(lpDDSPic3, hbm, 300, 680,   340, 200);
	    
		// 释放hbm位图对象
		DeleteObject(hbm);
		return true;
	case 1:										// 菜单
		cDSound.SetTrack("wav\\gun.wav",1);
		cDSound.SetTrack("wav\\ack.wav",2);
		cDSound.SetTrack("wav\\dead.wav",3);
		cDSound.SetTrack("wav\\fire.wav",4);
		iSelectMainMenuNo=1;
		
		// 从磁盘文件中将我们所需要的图象载入到一个hbm位图对象中
		hbm = (HBITMAP)LoadImage(hInst, "IDB_TITLE", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);	// |LR_LOADFROMFILE);
		
		if (hbm == NULL)
			return FALSE;
		
		DDCopyBitmap(lpDDSPic1, hbm, 0, 0,   640, 480);
		DDCopyBitmap(lpDDSPic7, hbm, 0, 680, 300, 200);
	    DDCopyBitmap(lpDDSPig, hbm, 0, 0, 100, 200);
		DDSetColorKey(lpDDSPic1, CLR_INVALID);
		DDSetColorKey(lpDDSPic7, CLR_INVALID);
		DDSetColorKey(lpDDSPig, CLR_INVALID);
		
		// 释放hbm位图对象
		DeleteObject(hbm);
		return true;
	case 3:										// 开始1关
		// ShowCursor(false);   				// 隐藏光标
		// FILE *fin;
		// fin=fopen("data\\enemy.001","rb");
		// if (fin==NULL)
		// 	return false;
		// for(i=0;i<512;i++)
		// 	for(j=0;j<512;j++)
		// 		fscanf(fin,"%d",&iEnemyWay[i][j]);
		// fprintf(fin,"200\r\n");
		// fclose(fin);
	
		iFX=300;
		iFY=400;
		iFSpeed=2;
		int i;
		// ,j=0;
		

		for (i=0;i<40;i++)
		{
			// if (j==0)j=1;
			// else j=0;
			
			iBomX[i]=-100;
			iBomY[i]=-100;
			bBomBI[i]=false;
		}

		cMidi.Stop();
		cMidi.ChangePlay("wav\\fight.mid");
		
		// 从磁盘文件中将我们所需要的图象载入到一个hbm位图对象中
		hbm = (HBITMAP)LoadImage(hInst, "IDB_FJ1", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);	// |LR_LOADFROMFILE);
		
		if (hbm == NULL)
			return FALSE;

		DDCopyBitmap(lpDDSPic1, hbm, 0, 0,   640, 480);											// 设置一个640*480的页面
		DDSetColorKey(lpDDSPic1, CLR_INVALID);
		
		// 释放hbm位图对象
		DeleteObject(hbm);
		
		hbm = (HBITMAP)LoadImage(hInst, "IDB_FJ01", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);	// |LR_LOADFROMFILE);
		
		if (hbm == NULL)
			return FALSE;
		
		DDCopyBitmap(lpDDSPic2, hbm, 0, 0, 1980, 320);
		DDSetColorKey(lpDDSPic2, CLR_INVALID);
		
		// 设置一个1980 x 320 的页面
		// 释放hbm位图对象
		DeleteObject(hbm);

		hbm = (HBITMAP)LoadImage(hInst, "pic\\map01.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
		// LR_CREATEDIBSECTION如果缺少,将导致颜色偏差
		
		if (hbm == NULL)
			return FALSE;
		
		DDCopyBitmap(lpDDSPic8, hbm, 0, 0, 640, 2400);
		DDSetColorKey(lpDDSPic8, CLR_INVALID);
		
		// 设置一个640 x 2400 的页面
		// 释放hbm位图对象
		DeleteObject(hbm);

		return true;
	}

	return false;
}

// 更新屏幕

void MainLoop( void )  						// 程序循环
{
	// 计算刷新率
	static int siFrame=0, siNewTime=0, siOldTime=0;
	static int siNewUpTime=0,siOldUpTime=0;
	siFrame++;
	siNewTime=timeGetTime(); 
	siNewUpTime=siNewTime;

	if (siNewTime > siOldTime+1000)
	{
		siOldTime=siNewTime;
		iFps=siFrame;
		siFrame=0;
		iDelayB=iFps/48;
	}
	
	if (siNewUpTime>siOldUpTime+2)
	{
		siOldUpTime=siNewUpTime;
		iMoveTitleStep+=1;
		// bMoveFlag=true;
	}
	
	if (bInitAgain)
	{
		if (InitThread()==false)
		{
			iThread=999;
			QuitOneThread();
		}
	}
	
	switch (iThread)
	{
	case 0:								// info display
		InfoDisplay();
		break;
	case 1:								// title display
		/*TitleDisplay();
		break;
	case 2:*/
		MainMenu();
		break;
	case 3:
		LetGo();
		break;
	}
}

void SetRect(RECT *rect, long left, long top, long right, long bottom)
{
	rect->left=left;
	rect->top=top;
	rect->right=right;
	rect->bottom=bottom;
}

void InfoDisplay()
{
	HRESULT		ddrval;
	static n=0;
	RECT  backR1, frontR1;
	SetRect(&backR1,  0, 0, 340, 200);
	SetRect(&frontR1, 150,150, 490, 350);

	// 清屏后台缓冲区
	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, lpDDSPic3, &backR1, DDBLT_WAIT, NULL);

	if (bTimeToUp)												// 没有按Esc时自动计时
	{
		bTimeToUp=false;
		n+=1;
	
		if (n>100)
		{
			// FreeThread();
			// iThread=1;
			// bInitAgain=true;
			QuitOneThread();
		}
	}

	// 打印刷新率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=lpDDSPic3->Restore(); 						// 恢复离屏页面3
			
			if (ddrval!=DD_OK)
				break;
			
			if (!InitThread())
				break; 											// 重新提取背景
		}

        if (ddrval != DDERR_WASSTILLDRAWING)
			break;
	}
}

void MainMenu()
{
	HRESULT		ddrval;
	RECT backR1, frontR1,backR2, frontR2,backR3, frontR3;

⌨️ 快捷键说明

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