|
|
//-----------------------------------------------------------------------------
// 添加头文件
//-----------------------------------------------------------------------------
#include "stdafx.h" //公共头文件
#include "D3Ddevice.h" //D3D设备类头文件
#include "GameManage.h"//游戏管理类头文件
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
BOOL g_rs = TRUE;//渲染状态
HWND g_hWnd = NULL;//窗口句柄
CD3Ddevice* g_pDd = NULL;//设备类指针
CGameManage* g_pGM = NULL;//游戏管理类指针
//-----------------------------------------------------------------------------
// 全局函数
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); //窗口消息(回调函数)
VOID RegisterNewClass(WNDCLASSEX &wc); //注册窗口类
VOID CreateNewWindow(HWND &hWnd, WNDCLASSEX &wc);//创建窗口
VOID CleanData(); //清除数据
HRESULT InitData(); //初始化数据
VOID Updata(); //更新
VOID Render(); //渲染
//-----------------------------------------------------------------------------
// 程序入口,程序框架
//-----------------------------------------------------------------------------
INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, INT)
{
WNDCLASSEX wc; //窗口类
RegisterNewClass(wc); //●注册窗口类
CreateNewWindow(g_hWnd, wc); //●创建窗口
if(FAILED(InitData())) //●初始化数据
{
CleanData(); //●清除数据
}else
{
ShowWindow(g_hWnd, SW_SHOWDEFAULT); //显示窗口
UpdateWindow(g_hWnd); //更新窗口
MSG msg; //消息数据
ZeroMemory(&msg, sizeof(msg)); //清空消息数据
while(msg.message != WM_QUIT) //●消息循环
{
if(PeekMessage( //★有无消息都会返回
&msg, //保存消息
NULL, //窗口句柄
0U, //消息范围最小值
0U, //消息范围最大值
PM_REMOVE //对消息队列的操作
))
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg); //发送消息
}else
{
Updata(); //★更新
Render(); //★渲染
}
}
}
UnregisterClass( //●卸载窗口
L"D3D GAME", //窗口名称
wc.hInstance); //窗口的应用程序实例
return 0;
}
//-----------------------------------------------------------------------------
// 注册窗口类
//-----------------------------------------------------------------------------
VOID RegisterNewClass(WNDCLASSEX &wc)
{
wc.cbSize = sizeof(WNDCLASSEX); //描述整个wcex变量的大小
wc.style = CS_CLASSDC; //定义窗口类风格
wc.lpfnWndProc = MsgProc; //回调函数的函数名
wc.cbClsExtra = 0L; //额外类空间
wc.cbWndExtra = 0L; //描述额外类空间
wc.hInstance = GetModuleHandle(NULL); //标识这个窗口类和哪个应用程序的实例相关联
wc.hIcon = NULL; //窗口类的图标,显示在窗口左上角
wc.hCursor = LoadCursor(NULL, IDC_ARROW);//窗口类的鼠标光标
wc.hbrBackground = NULL; //窗口背景颜色
wc.lpszMenuName = NULL; //关联一个窗口菜单
wc.lpszClassName = L"D3D GAME"; //窗口类的名称
wc.hIconSm = NULL; //窗口最小化图标
RegisterClassEx(&wc); //注册窗口类
}
//-----------------------------------------------------------------------------
// 创建窗口
//-----------------------------------------------------------------------------
VOID CreateNewWindow(HWND &hWnd, WNDCLASSEX &wc)
{
hWnd = CreateWindow(
L"D3D GAME", //窗口类的名(必须和注册窗口类的名称相同)
L"游戏项目", //窗口实例的标题名
WS_OVERLAPPEDWINDOW^WS_THICKFRAME,//窗口的风格
CW_USEDEFAULT, //窗口X坐标
CW_USEDEFAULT, //窗口Y坐标
CW_USEDEFAULT, //窗口的宽度
CW_USEDEFAULT, //窗口的高度
NULL, //窗口有无父窗口
NULL, //窗口有无主菜单
wc.hInstance, //应用程序当前句柄
NULL //是否使用该值技能归纳
);
}
//-----------------------------------------------------------------------------
// 清除数据
//-----------------------------------------------------------------------------
VOID CleanData()
{
SAFE_DELETE(g_pGM);
SAFE_DELETE(g_pDd);
}
//-----------------------------------------------------------------------------
// 初始化数据
//-----------------------------------------------------------------------------
HRESULT InitData()
{
//加载D3D设备数据
g_pDd = new CD3Ddevice(g_hWnd);
if(FAILED(g_pDd->InitData()))
{
return E_FAIL;
}
//加载游戏数据
g_pGM = new CGameManage(g_hWnd, g_pDd);
if(FAILED(g_pGM->InitData()))
{
return E_FAIL;
}
return S_OK;
}
//-----------------------------------------------------------------------------
// 更新
//-----------------------------------------------------------------------------
VOID Updata()
{
g_pGM->Updata();
}
//-----------------------------------------------------------------------------
// 渲染
//-----------------------------------------------------------------------------
VOID Render()
{
//★预判断
if(g_rs == FALSE)
{
return;
}
LPDIRECT3DDEVICE9 pDevice = g_pDd->GetDevice();
if(pDevice == NULL)
{
return;
}
//★清屏(后台缓冲区)
pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
//★开始渲染
if(SUCCEEDED(pDevice->BeginScene()))
{ //★渲染内容
g_pGM->Render();
//★结束渲染
pDevice->EndScene();
}
//★屏幕翻转(后台缓冲区的数据交换到前台缓冲区,COPY模式下才更改参数)
pDevice-> resent(
NULL, //复制源的矩形区域指针
NULL, //复制目的地的矩形区域指针
NULL, //D3D设备窗口句柄
NULL //最小更新区域指针
);
}
//-----------------------------------------------------------------------------
// 窗口消息(回调函数)
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
g_pGM->MsgProc(msg, lParam);
switch(msg)
{
case WM_SIZE://窗口大小
switch(wParam)
{
case SIZE_RESTORED: //窗口还原大小
g_rs = TRUE;
break;
case SIZE_MINIMIZED://窗口最小化
g_rs = FALSE;
break;
}
break;
case WM_ACTIVATE://窗口焦点激活状态
switch(wParam)
{
case WA_CLICKACTIVE://窗口获得焦点
case WA_ACTIVE:
g_rs = TRUE;
break;
case WA_INACTIVE://窗口失去焦点
g_rs = FALSE;
break;
}
break;
case WM_DESTROY:
CleanData();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
} |
|