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

📄 main.cpp

📁 打飞机的游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <ddraw.h>

#include "resource.h"
#include "stdio.h"

#include "ddutil.h"
#include "CMidi.h"
#include "CDSound.h"

#define		TITLE		"突袭II"		// 窗口标题
#define		CLASSNAME	"突袭II"		// 窗口类名

HINSTANCE	hInst;						// 应用程序实例句柄
HWND		hWndMain;					// 主窗口句柄

LPDIRECTDRAW            lpDD;           // DirectDraw对象
LPDIRECTDRAWSURFACE     lpDDSPrimary;   // 主页面		640x480
LPDIRECTDRAWSURFACE     lpDDSBack;      // 后台缓冲区	640x480
LPDIRECTDRAWSURFACE     lpDDSPic1;      // 离屏页面1	640x480
LPDIRECTDRAWSURFACE     lpDDSPic2;      // 离屏页面2	1980x320
LPDIRECTDRAWSURFACE     lpDDSPic3;      // 离屏页面3	340x200
LPDIRECTDRAWSURFACE     lpDDSPic4;      // 离屏页面4	220x480
LPDIRECTDRAWSURFACE     lpDDSPic5;      // 离屏页面5	220x480
LPDIRECTDRAWSURFACE     lpDDSPic6;      // 离屏页面6	200x480
LPDIRECTDRAWSURFACE     lpDDSPic7;      // 离屏页面7	300x200
LPDIRECTDRAWSURFACE     lpDDSPic8;      // 离屏页面8	640x2400

LPDIRECTDRAWSURFACE     lpDDSPig;		// 离屏页面		100x200
LPDIRECTDRAWPALETTE     lpDDPal;        // 调色板
BOOL                    bActive;        // 应用程序激活标志T为激活

// 函数声明
BOOL InitThread( void );				// 准备进程
bool FreeThread(void);					// 释放进程
void MainLoop( void );					// 程序循环
void TitleDisplay(void);				// 标题
void FreeResource( void );				// 释放资源
HRESULT RestoreAll( void );				// 恢复
void QuitOneThread( void);				// 退出一个进程并且销毁分配的资源
void InfoDisplay(void );				// 显示序
void MainMenu(void );					// 显示主菜单
void LetGo(void);						// 进入主要程序
void SetRect(RECT *rect, long left, long top, long right, long bottom);
										// 设置填充矩形参数

// 扩展类
CMidi cMidi;							// 定义播放Midi的类
CDSound cDSound;						// 定义播放DirectSound的类

// 全局变量说明
int iThread = 0;						// 程序进程唯一编号
										// 0		播放序 
										// 1		显示标题
										// 2		显示主选单
										// 3    开始
										// 999  退出
int iFps=0;    							// 刷新率计数器
int iDelayB=1;							// 刷新分配倍数
int iSelectMainMenuNo=0;				// 主选菜单项号,0为无
int iMoveTitleStep=320; 				// 序移动偏移量(左->右,右->左,中->右)
int iMouseMoveX=0; 						// 鼠标移动变量.左右
int iMouseMoveY=0; 						// 鼠标移动变量.上下
bool bTitleAbort=FALSE; 				// 序完成或者被用户中断标志
bool bSoundDrive=FALSE; 				// 音频设备备妥标志
int iMoveWay=5;     					// 移动标志8上2下4左6右5不动
bool bMouseLButton=false;  				// 鼠标左键按下标志
int iMoveFlag=4;      					// 移动标志8上2下4左6右5不动
bool bMoveFlag=false;  					// 移动允许标志
bool bInitAgain=true;  					// 重新初始化标志
bool bTimeToUp=false;   				// 计时标志
bool bTimeToUp2=false;   				// 计时标志2
bool bTimeToUp2_back=false;   			// 计时背景标志2
bool bFire=false;						// 发射允许标志
int iFX,iFY,iFSpeed;					// 飞弹位置,速度
int iBomX[40],iBomY[40];
bool bBomBI[40];
int iBom=0;
int iFang=16;							// 左右偏移位标
int iGameLife=5;						// 玩家飞机数
int iGameBom=3;							// 玩家保护数
int iGameBlood=5;						// 玩家能量
unsigned int iEnemyWay[512][512];		// 敌人运行轨迹
char cExeFullPath[256];					// 程序工作目录
int i,j;								// 临时变量
	
// *******************************************************************
// 函数:FreeResource
// 功能:释放我们用过的所有DirectDraw对象
// *******************************************************************
void FreeResource( void )  					// 释放资源
{
    if (lpDD != NULL )						// 释放DirectDraw对象
    {
        if (lpDDSPrimary != NULL )			// 释放主页面
        {
            lpDDSPrimary->Release();
            lpDDSPrimary = NULL;
        }

        if (lpDDSBack!= NULL )				//  释放后台缓冲区	
        {
            lpDDSBack->Release();
            lpDDSBack = NULL;
        }

        if (lpDDSPic1 != NULL )				// 释放离屏页面1
        {
            lpDDSPic1->Release();
            lpDDSPic1 = NULL;
        }

        if (lpDDSPic2 != NULL )				// 释放离屏页面2
        {
            lpDDSPic2->Release();
            lpDDSPic2 = NULL;
        }

		if (lpDDSPic3 != NULL )				// 释放离屏页面3
        {
            lpDDSPic3->Release();
            lpDDSPic3 = NULL;
        }

		if (lpDDSPic4 != NULL )				// 释放离屏页面4
        {
            lpDDSPic4->Release();
            lpDDSPic4 = NULL;
        }

        if (lpDDSPic5 != NULL )				// 释放离屏页面5
        {
            lpDDSPic5->Release();
            lpDDSPic5 = NULL;
        }

		if (lpDDSPic6 != NULL )				// 释放离屏页面6
        {
            lpDDSPic6->Release();
            lpDDSPic6 = NULL;
        }

		if (lpDDSPic7 != NULL )				// 释放离屏页面7
        {
            lpDDSPic7->Release();
            lpDDSPic7 = NULL;
        }

		if (lpDDSPic8 != NULL )				// 释放离屏页面8
        {
            lpDDSPic8->Release();
            lpDDSPic8 = NULL;
        }

		if (lpDDSPig != NULL )				// 释放离屏页面
        {
            lpDDSPig->Release();
            lpDDSPig = NULL;
        }

		if (lpDDPal != NULL )				// 释放调色板
		{
            lpDDPal->Release();
            lpDDPal = NULL;
        }

        lpDD->Release();
        lpDD = NULL;
    }

	KillTimer(hWndMain,1);
	KillTimer(hWndMain,2);
} 

// *******************************************************************
// 函数:WindowProc
// 功能:主窗口的消息处理过程
// *******************************************************************
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, 
                            WPARAM wParam, LPARAM lParam )
{
    switch ( message )
    {
    case WM_ACTIVATEAPP:					// 应用程序激活消息
        bActive = wParam;
        break;
	case WM_KEYUP:							// 按键释放判断
		switch( wParam )
        {
        case VK_DOWN:
			if (iMoveWay==2)
				iMoveWay=5;
			break;
        case VK_UP:
			if (iMoveWay==8)
				iMoveWay=5;
			break;
        case VK_LEFT:
			if (iMoveWay==4)
				iMoveWay=5;
			break;
        case VK_RIGHT:
			if (iMoveWay==6)
				iMoveWay=5;
			break;
		case VK_CONTROL:
			bFire=false;
			break;
		}
		break;
    case WM_KEYDOWN:						// 按键按下判断
        switch( wParam )
        {
        case VK_ESCAPE:						// 如果按下Esc就返回上级操作
            QuitOneThread();
            break;
		case 0x36:  						// no 6
			if (iFSpeed<=800)
			iFSpeed+=1;
			break;
		case 0x37:  						// no 7
			if (iFSpeed>1)
				iFSpeed-=1;
			else iFSpeed=1;
			break;
		case VK_DOWN:						// 下
			iMoveWay=2;
		
			if (iThread==1)					// 如果在菜单选择
			{
				if (iSelectMainMenuNo<=3)
				{
					iSelectMainMenuNo+=1;
				}
				else
					iSelectMainMenuNo=1;
			}
			break;
		case VK_UP:							// 上
			iMoveWay=8;
			
			if (iThread==1)					// 如果在菜单选择
			{
				if (iSelectMainMenuNo>=2)
				{
					iSelectMainMenuNo-=1;
				}
				else
					iSelectMainMenuNo=4;
			}
			break;
		case VK_LEFT:						// 左
			iMoveWay=4;
			
			if (bTimeToUp2)
			{
				bTimeToUp2=false;
				if (iFang>10)
					iFang-=1;
			}
			break;
		case VK_RIGHT:						// 右
			iMoveWay=6;

			if (bTimeToUp2)
			{
				bTimeToUp2=false;
				if (iFang<23)
					iFang+=1;
			}
			break;
		case VK_RETURN:						// 回车
			if (iThread==1)					// 如果是在菜单选择,有效
			{
				if (iSelectMainMenuNo==4)	// 选择了退出
				{
					iThread=999;
					QuitOneThread();
				}
			
				if (iSelectMainMenuNo==1)	// 选择了NewG
				{
					bInitAgain=true;
					iThread=3;
				}
			}
			break;
		case VK_CONTROL:					// Ctrl键
			bFire=true;
			break;
		}
        break;
	/*case WM_MOUSEMOVE:					// 鼠标移动
		if (iThread==2)  					// 在主选单中
		{
			iMouseMoveX=lParam&0xffff;
			iMouseMoveY=lParam>>16;
			iSelectMainMenuNo=0;
			
			if (iMouseMoveX>250&&iMouseMoveX<390)
			{
				if (iMouseMoveY>=260&&iMouseMoveY<310)
					iSelectMainMenuNo=1;
				if (iMouseMoveY>=310&&iMouseMoveY<360)
					iSelectMainMenuNo=2;
				if (iMouseMoveY>=360&&iMouseMoveY<410)
					iSelectMainMenuNo=3;
				if (iMouseMoveY>=410&&iMouseMoveY<460)
					iSelectMainMenuNo=4;
			}
		}
	case WM_LBUTTONDOWN:   					// 鼠标左击
		switch(wParam)
		{
		case MK_LBUTTON:
			iMouseMoveX=lParam&0xffff;
			iMouseMoveY=lParam>>16;
			bMouseLButton=true;
			
			if (iThread==2)
			{
				if (iSelectMainMenuNo==4)
				{
					iThread=999;
					QuitOneThread();
				}
			
			    if (iSelectMainMenuNo==1)
				{
					bInitAgain=true;
					iThread=3;
				}
			}
			break;
		}
		break;*/
	case WM_TIMER:
		switch ( wParam )
		{
		case 1:
			bTimeToUp=!bTimeToUp;			// 计时器到点,用于动画切换
			break;
		case 2:
			bTimeToUp2=true;
			bTimeToUp2_back=true;
		default:
			break;
		}
		break;
	case MM_MCINOTIFY:						// Midi播送完
		if (bSoundDrive)
			cMidi.Replay();
		break;
    case WM_DESTROY:						// 销毁窗口消息
        FreeResource();
        PostQuitMessage(0);
        break;
    }

	// 调用缺省的过程处理过程
    return DefWindowProc(hWnd, message, wParam, lParam);
}

// ******************************************************************
// 函数:InitWindow()
// 功能:创建主窗口。
// ******************************************************************
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
    WNDCLASS			wc;					// 窗口类结构

	// 填充窗口类结构
    wc.style = 0;
    wc.lpfnWndProc = WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));

	// 在任务切换中显示图标
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
	
	// 提取鼠标样式
    wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);	// 选择黑色刷做为窗口背景
    wc.lpszMenuName = NULL;										// windows未用保留为NULL
	wc.lpszClassName = CLASSNAME;

	// 注册窗口类
    RegisterClass( &wc );
    
	// 创建主窗口
    hWndMain= CreateWindowEx(
		0,
		CLASSNAME,												// 窗口的类名称,必须与上面的wc.lpszClassName一致
		TITLE,													// 窗口的标题名
		WS_POPUP,
		0,
		0,
		GetSystemMetrics( SM_CXSCREEN ),
		GetSystemMetrics( SM_CYSCREEN ),
		NULL,
		NULL,
		hInstance,
		NULL );

    if (!hWndMain )
		return FALSE;											// 创建失败就返回报告错误		

	// SetCursor(LoadCursor(hInstance,"IDC_CUR"));				// 指定使用光标
	// ShowCursor(FALSE);   									// 隐藏光标
	
	// 显示并更新窗口
    ShowWindow( hWndMain, nCmdShow );
    UpdateWindow( hWndMain );
	return TRUE;
}

// ******************************************************************
// 函数:InitDDraw()
// 功能:初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区)
// 		以及创建一个定时器。
// ******************************************************************
BOOL InitDDraw(void)
{
    DDSURFACEDESC       ddsd;
    DDSCAPS             ddscaps;
    HRESULT             ddrval;

⌨️ 快捷键说明

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