📄 main.cpp
字号:
#include "StdAfx.h"
#include "../common/myd3d.h"
#include "game.h"
//-----------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------
const int SCREEN_Width = 640;
const int SCREEN_Height = 480;
TCHAR winClassName[] = TEXT("MyGame"); // WNCLASS名
TCHAR winTitleName[] = TEXT("赛车游戏DEMO"); // 窗口标题名
HWND g_hwnd=0;
IDirect3DDevice9* g_device = 0;
BOOL g_bActive = FALSE;
//创建Game对象cGame
Game cGame;
//----------------------------------------------------------------------
//前向声明
//----------------------------------------------------------------------
bool WinInit( HINSTANCE hInst, int nCmdShow, HWND *phWnd);
bool InitD3D(HWND hwnd,D3DDEVTYPE deviceType, IDirect3DDevice9** ppdevice);
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
//----------------------------------------------------------------------
//入口函数
//----------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
//初始化窗口
if(!WinInit( hinstance, showCmd, &g_hwnd) )
{
::MessageBox(g_hwnd, TEXT("WinInit() - FAILED"), 0, 0);
return 0;
}
//初试化D3D
if( !InitD3D(g_hwnd, D3DDEVTYPE_HAL , &g_device))
{
::MessageBox(g_hwnd, TEXT("InitD3D() - FAILED"), 0, 0);
return 0;
}
//初始化游戏
if( !cGame.GameInit() )
{
::MessageBox(g_hwnd, TEXT("GameInit() - FAILED"), 0, 0);
return 0;
}
//进入游戏循环
cGame.EnterMsgLoop();
//关闭游戏
cGame.GameShutDown();
//释放设备
g_device->Release();
return 0;
}
bool WinInit( HINSTANCE hInstance, int nCmdShow, HWND *phWnd)
{
//定义一个窗口类并填充
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口类样式
wc.lpfnWndProc = WndProc; //窗口回调函数
wc.cbClsExtra = 0; //类的额外内存
wc.cbWndExtra = 0; //窗口的额外内存
wc.hInstance = hInstance; //窗口实例句柄
wc.hIcon = LoadIcon(0, IDI_APPLICATION); //图标句柄
wc.hCursor = LoadCursor(0, IDC_ARROW); //光标句柄
wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //画刷句柄
wc.lpszMenuName = 0; //菜单名
wc.lpszClassName = winClassName; //窗口类名
//注册窗口
if( !RegisterClass(&wc) )
{
::MessageBox(0, TEXT("RegisterClass() - FAILED"), 0, 0);
return false;
}
//创建窗口
HWND hwnd = 0;
hwnd = ::CreateWindow( winClassName, winTitleName,
/*WS_EX_TOPMOST*/WS_POPUP, //窗口类型
100, 60, //窗口位置
SCREEN_Width, SCREEN_Height, //窗口宽高
0 , //父窗口句柄
0 , //菜单句柄
hInstance, //实例句柄
0); //附加参数
if( !hwnd )
{
::MessageBox(0, TEXT("CreateWindow() - FAILED"), 0, 0);
return false;
}
::ShowWindow(hwnd, nCmdShow/*SW_SHOW*/);
::UpdateWindow(hwnd);
//保存窗口的句柄
*phWnd = hwnd;
return true;
}
//-----------------------------------------------------------------------------
// 名称:InitD3D()
// 功能:初始化D3D
//-----------------------------------------------------------------------------
bool InitD3D(HWND hwnd,D3DDEVTYPE deviceType, IDirect3DDevice9** ppdevice)
{
HRESULT hr = 0;
// 1.获得一个IDirect3D9接口指针.
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if( !d3d9 )
{
::MessageBox(0, TEXT("Direct3DCreate9() - FAILED"), 0, 0);
return false;
}
// 2.检查设备能力
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
::MessageBox(hwnd, TEXT("支持硬件顶点处理"), 0, 0);
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
/*::MessageBox(hwnd, TEXT("不支持硬件顶点处理"), 0, 0);*/
}
// 3.填充 D3DPRESENT_PARAMETERS 结构.
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = SCREEN_Width; //后备缓冲宽度
d3dpp.BackBufferHeight = SCREEN_Height; //后备缓冲高度
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //后备缓冲格式
d3dpp.BackBufferCount = 1; //后备缓冲数
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //抗锯齿类型
d3dpp.MultiSampleQuality = 0; //抗锯齿等级
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //表面交换方式
d3dpp.hDeviceWindow = g_hwnd; //关联窗口句柄
d3dpp.Windowed = true; //是否窗口模式显示
d3dpp.EnableAutoDepthStencil = true; //是否自动创建深度/模板缓冲
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; //深度/模板缓冲格式
d3dpp.Flags = 0; //附加标志
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //刷新率
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //交换方式
// 4.创建设备
hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, deviceType, hwnd,
vp, &d3dpp, ppdevice);
if( FAILED(hr) )
{
// 尝试使用16位深度缓冲格式
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, deviceType, hwnd,
vp, &d3dpp, ppdevice);
if( FAILED(hr) )
{
d3d9->Release();
::MessageBox(0, TEXT("CreateDevice() - FAILED"), 0, 0);
return false;
}
}
d3d9->Release();
return true;
}
//-----------------------------------------------------------------------------
// 名称:WndProc()
// 功能:处理消息
//-----------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_ACTIVATEAPP:
g_bActive = (BOOL)wParam;
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
case WM_KEYDOWN:
if( wParam == VK_ESCAPE )
::DestroyWindow(hwnd);
if( KEYDOWN(VK_LSHIFT))//shift键切换视野
cGame._topView = !cGame._topView;
if( KEYDOWN(VK_LCONTROL) )
{
cGame._freeView = !cGame._freeView;
cGame._gameViewType = cGame.FREE;
}
if( cGame._gameState==Game::GameState_Over )
{
if( KEYDOWN('Y') )
cGame._gameState = Game::GameState_ReBegin;
if( KEYDOWN('N') )
cGame._gameState = Game::GameState_Finish;
}
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -