📄 main.cpp
字号:
#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 + -