宏定义部分.docx
《宏定义部分.docx》由会员分享,可在线阅读,更多相关《宏定义部分.docx(21页珍藏版)》请在冰点文库上搜索。
宏定义部分
//-----------------------------------【宏定义部分】--------------------------------------------
//描述:
定义一些辅助宏
//------------------------------------------------------------------------------------------------
#defineWINDOW_WIDTH1366//为窗口宽度定义的宏,以方便在此处修改窗口宽度
#defineWINDOW_HEIGHT768//为窗口高度定义的宏,以方便在此处修改窗口高度
#defineWINDOW_TITLE_T//为窗口标题定义的宏
//-----------------------------------【头文件包含部分】---------------------------------------
//描述:
包含程序所依赖的头文件
//------------------------------------------------------------------------------------------------
#include
#include
#include
#include
#include"D3DUtil.h"
#include"D3DGUIClass.h"
//-----------------------------------【库文件包含部分】---------------------------------------
//描述:
包含程序所依赖的库文件
//------------------------------------------------------------------------------------------------
#pragmacomment(lib,"d3d9.lib")
#pragmacomment(lib,"d3dx9.lib")
#pragmacomment(lib,"dinput8.lib")//使用DirectInput必须包含的库文件,注意这里有8
#pragmacomment(lib,"dxguid.lib")
#pragmacomment(lib,"winmm.lib")
//地板的顶点结构
structCUSTOMVERTEX
{
FLOAT_x,_y,_z;
FLOAT_u,_v;
CUSTOMVERTEX(FLOATx,FLOATy,FLOATz,FLOATu,FLOATv)
:
_x(x),_y(y),_z(z),_u(u),_v(v){}
};
#defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZ|D3DFVF_TEX1)
//-----------------------------------【全局变量声明部分】-------------------------------------
//描述:
全局变量的声明
//------------------------------------------------------------------------------------------------
LPDIRECT3DDEVICE9g_pd3dDevice=NULL;//Direct3D设备对象
LPD3DXFONTg_pTextFPS=NULL;//字体COM接口
LPD3DXFONTg_pTextAdaperName=NULL;//显卡信息的2D文本
LPD3DXFONTg_pTextHelper=NULL;//帮助信息的2D文本
LPD3DXFONTg_pTextInfor=NULL;//绘制信息的2D文本
floatg_FPS=0.0f;//一个浮点型的变量,代表帧速率
wchar_tg_strFPS[50]={0};//包含帧速率的字符数组
wchar_tg_strAdapterName[60]={0};//包含显卡名称的字符数组
boolg_LMBDown=false;//GUI中的鼠标状态信息,鼠标左键是否按下的标识
intg_MouseX=0,g_MouseY=0;//存储鼠标坐标的两个变量
//创建四个GUI类对象,分别代表四个页面
D3DGUIClass*g_MainGUI=NULL;//主窗口
D3DGUIClass*g_StartGUI=NULL;//游戏开始窗口
D3DGUIClass*g_LoadGUI=NULL;//游戏载入窗口
D3DGUIClass*g_OptionGUI=NULL;//游戏设置窗口
intg_MainGUIFontID=-1;//GUI中字体对象的ID
intg_StartGUIFontID=-1;//GUI中字体对象的ID
intg_LoadGUIFontID=-1;//GUI中字体对象的ID
intg_OptionGUIFontID=-1;//GUI中字体对象的ID
intg_currentGUI=GUI_MAIN_SCREEN;//一个当前的GUI标识
//-----------------------------------【全局函数声明部分】-------------------------------------
//描述:
全局函数声明,防止“未声明的标识”系列错误
//------------------------------------------------------------------------------------------------
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);
HRESULTDirect3D_Init(HWNDhwnd,HINSTANCEhInstance);
HRESULTObjects_Init();
voidDirect3D_Render(HWNDhwnd,FLOATfTimeDelta);
voidDirect3D_Update(HWNDhwnd,FLOATfTimeDelta);
voidDirect3D_CleanUp();
floatGet_FPS();
voidHelpText_Render(HWNDhwnd);
voidGUICallback(intid,intstate);
//-----------------------------------【WinMain()函数】--------------------------------------
//描述:
Windows应用程序的入口函数,我们的程序从这里开始
//------------------------------------------------------------------------------------------------
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd)
{
//开始设计一个完整的窗口类
WNDCLASSEXwndClass={0};//用WINDCLASSEX定义了一个窗口类,即用wndClass实例化了WINDCLASSEX,用于之后窗口的各项初始化
wndClass.cbSize=sizeof(WNDCLASSEX);//设置结构体的字节数大小
wndClass.style=CS_HREDRAW|CS_VREDRAW;//设置窗口的样式
wndClass.lpfnWndProc=WndProc;//设置指向窗口过程函数的指针
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hInstance;//指定包含窗口过程的程序的实例句柄。
wndClass.hIcon=(HICON):
:
LoadImage(NULL,_T("GameMedia\\icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);//从全局的:
:
LoadImage函数从本地加载自定义ico图标
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);//指定窗口类的光标句柄。
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);//为hbrBackground成员指定一个灰色画刷句柄
wndClass.lpszMenuName=NULL;//用一个以空终止的字符串,指定菜单资源的名字。
wndClass.lpszClassName=_T("ForTheDreamOfGameDevelop");//用一个以空终止的字符串,指定窗口类的名字。
if(!
RegisterClassEx(&wndClass))//设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
return-1;
HWNDhwnd=CreateWindow(_T("ForTheDreamOfGameDevelop"),WINDOW_TITLE,//喜闻乐见的创建窗口函数CreateWindow
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,
WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);
//Direct3D资源的初始化,调用失败用messagebox予以显示
if(!
(S_OK==Direct3D_Init(hwnd,hInstance)))
{
MessageBox(hwnd,_T("Direct3D初始化失败~!
"),_T("浅墨的消息窗口"),0);//使用MessageBox函数,创建一个消息窗口
}
PlaySound(L"GameMedia\\AssassinsCreedTheme刺客信条.wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);//循环播放背景音乐
MoveWindow(hwnd,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,true);//调整窗口显示时的位置,窗口左上角位于屏幕坐标(200,10)处
ShowWindow(hwnd,nShowCmd);//调用Win32函数ShowWindow来显示窗口
UpdateWindow(hwnd);//对窗口进行更新,就像我们买了新房子要装修一样
//消息循环过程
MSGmsg={0};//初始化msg
while(msg.message!
=WM_QUIT)//使用while循环
{
staticFLOATfLastTime=(float):
:
timeGetTime();
staticFLOATfCurrTime=(float):
:
timeGetTime();
staticFLOATfTimeDelta=0.0f;
fCurrTime=(float):
:
timeGetTime();
fTimeDelta=(fCurrTime-fLastTime)/1000.0f;
fLastTime=fCurrTime;
if(PeekMessage(&msg,0,0,0,PM_REMOVE))//查看应用程序消息队列,有消息时将队列中的消息派发出去。
{
TranslateMessage(&msg);//将虚拟键消息转换为字符消息
DispatchMessage(&msg);//该函数分发一个消息给窗口程序。
}
else
{
Direct3D_Update(hwnd,fTimeDelta);//调用更新函数,进行画面的更新
Direct3D_Render(hwnd,fTimeDelta);//调用渲染函数,进行画面的渲染
}
}
UnregisterClass(_T("ForTheDreamOfGameDevelop"),wndClass.hInstance);
return0;
}
//-----------------------------------【WndProc()函数】--------------------------------------
//描述:
窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)//窗口过程函数WndProc
{
switch(message)//switch语句开始
{
caseWM_PAINT:
//客户区重绘消息
Direct3D_Render(hwnd,0.0f);//调用Direct3D_Render函数,进行画面的绘制
ValidateRect(hwnd,NULL);//更新客户区的显示
break;//跳出该switch语句
caseWM_KEYDOWN:
//键盘按下消息
if(wParam==VK_ESCAPE)//ESC键
DestroyWindow(hwnd);//销毁窗口,并发送一条WM_DESTROY消息
break;
caseWM_DESTROY:
//窗口销毁消息
Direct3D_CleanUp();//调用Direct3D_CleanUp函数,清理COM接口对象
PostQuitMessage(0);//向系统表明有个线程有终止请求。
用来响应WM_DESTROY消息
break;//跳出该switch语句
caseWM_KEYUP:
if(wParam==VK_ESCAPE)PostQuitMessage(0);
break;
caseWM_LBUTTONDOWN:
g_LMBDown=true;
break;
caseWM_LBUTTONUP:
g_LMBDown=false;
break;
caseWM_MOUSEMOVE:
g_MouseX=LOWORD(lParam);
g_MouseY=HIWORD(lParam);
break;
default:
//若上述case条件都不符合,则执行该default语句
returnDefWindowProc(hwnd,message,wParam,lParam);//调用缺省的窗口过程来为应用程序没有处理的窗口消息提供缺省的处理。
}
return0;//正常退出
}
//-----------------------------------【Direct3D_Init()函数】----------------------------------
//描述:
Direct3D初始化函数,进行Direct3D的初始化
//------------------------------------------------------------------------------------------------
HRESULTDirect3D_Init(HWNDhwnd,HINSTANCEhInstance)
{
//--------------------------------------------------------------------------------------
//【Direct3D初始化四步曲之一,创接口】:
创建Direct3D接口对象,以便用该Direct3D对象创建Direct3D设备对象
//--------------------------------------------------------------------------------------
LPDIRECT3D9pD3D=NULL;//Direct3D接口对象的创建
if(NULL==(pD3D=Direct3DCreate9(D3D_SDK_VERSION)))//初始化Direct3D接口对象,并进行DirectX版本协商
returnE_FAIL;
//--------------------------------------------------------------------------------------
//获取硬件设备信息
//--------------------------------------------------------------------------------------
D3DCAPS9caps;intvp=0;
if(FAILED(pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)))
{
returnE_FAIL;
}
if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;//支持硬件顶点运算,我们就采用硬件顶点运算,妥妥的
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;//不支持硬件顶点运算,无奈只好采用软件顶点运算
//--------------------------------------------------------------------------------------
//填充D3DPRESENT_PARAMETERS结构体
//--------------------------------------------------------------------------------------
D3DPRESENT_PARAMETERSd3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth=WINDOW_WIDTH;
d3dpp.BackBufferHeight=WINDOW_HEIGHT;
d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount=2;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality=0;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hwnd;
d3dpp.Windowed=true;
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=0;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
//--------------------------------------------------------------------------------------
//【Direct3D初始化四步曲之四,创设备】:
创建Direct3D设备接口
//--------------------------------------------------------------------------------------
if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
hwnd,vp,&d3dpp,&g_pd3dDevice)))
returnE_FAIL;
if(!
(S_OK==Objects_Init()))returnE_FAIL;
SAFE_RELEASE(pD3D)//LPDIRECT3D9接口对象的使命完成,我们将其释放掉
returnS_OK;
}
//-----------------------------------【Object_Init()函数】--------------------------------------
//描述:
渲染资源初始化函数,在此函数中进行要被渲染的物体的资源的初始化
//--------------------------------------------------------------------------------------------------
HRESULTObjects_Init()
{
//创建字体