📄 game.cpp
字号:
#include "StdAfx.h"
#include ".\game.h"
CGame::CGame(void) :
m_pD3D(NULL),
m_pDevice(NULL),
m_bDeviceLost(false),
m_pFont(NULL),
m_pInput(NULL),
m_pBox(NULL),
m_vPosition(0.0f, 0.0f, 0.0f),
m_fRotAngle(0.0f)
{
}
CGame::~CGame(void)
{
SAFE_RELEASE(m_pD3D);
SAFE_RELEASE(m_pDevice);
SAFE_RELEASE(m_pFont);
SAFE_DELETE(m_pInput);
SAFE_DELETE(m_pBox);
}
bool CGame::Init( HINSTANCE hInstance, HWND hWnd )
{
// COM初始化
CoInitialize(NULL);
if(FAILED(_InitD3D(hWnd)))
return false;
// 创建字体
D3DXCreateFont( m_pDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
"Arial", &m_pFont );
// 创建DirectInput的接口指针
if( FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDirectInput, NULL)) )
{
return false;
}
m_pInput = new _CD3dxInput;
m_pInput->Create(m_pDirectInput, hWnd);
m_pBox = new CBox;
m_pBox->Init(m_pDevice);
return true;
}
HRESULT CGame::_InitD3D(HWND hWnd)
{
// COM interface
if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
// current display mode
D3DDISPLAYMODE d3ddm;
if( FAILED(m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm)))
return E_FAIL;
RECT rect;
GetClientRect(hWnd, &rect);
ZeroMemory(&m_d3dpp, sizeof(m_d3dpp));
m_d3dpp.Windowed = TRUE/*FALSE*/;
m_d3dpp.BackBufferCount = 1;
m_d3dpp.BackBufferFormat = d3ddm.Format;
m_d3dpp.BackBufferWidth = rect.right - rect.left;
m_d3dpp.BackBufferHeight = rect.bottom - rect.top;
//m_d3dpp.BackBufferWidth = d3ddm.Width;
//m_d3dpp.BackBufferHeight = d3ddm.Height;
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
m_d3dpp.EnableAutoDepthStencil = TRUE;
// Create D3D Device
if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&m_d3dpp, &m_pDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
void CGame::Update(float fElapsedTime)
{
D3DXMATRIX matRroj;
D3DXMatrixPerspectiveFovLH( &matRroj, D3DX_PI/4, 4.f/3.f, 1.f, 500.0f );
m_pDevice->SetTransform(D3DTS_PROJECTION, &matRroj);
// 更新视矩阵
D3DXMATRIX matView;
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3(13.0f, 13.0f, 13.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f) );
m_pDevice->SetTransform(D3DTS_VIEW, &matView);
//分别获取键盘与鼠标的设备指针
LPDIRECTINPUTDEVICE8 pKeyboard = m_pInput->GetKeyboardDevice();
LPDIRECTINPUTDEVICE8 pMouse = m_pInput->GetMouseDevice();
//定义一个字符数组用来存储键盘信息
char keyboardState[256];
if(FAILED(pKeyboard->GetDeviceState(sizeof(keyboardState), (LPVOID)&keyboardState)))
{
pKeyboard->Acquire();
return;
}
//定义一个用来接收鼠标信息的结构体对象,存储鼠标的输入信息
DIMOUSESTATE MouseState;
if(FAILED(pMouse->GetDeviceState(sizeof(MouseState),(LPVOID)&MouseState)))
{
pMouse->Acquire();
return;
}
///////////////以下是用来对输入进行处理的代码////////////////////////////
//鼠标的左键
if(MouseState.rgbButtons[0] & 0x80)
m_fRotAngle += 1.5f * fElapsedTime;
//鼠标的右键
if(MouseState.rgbButtons[1] & 0x80)
m_fRotAngle -= 1.5f * fElapsedTime;
//键盘的按键
if(keyboardState[DIK_W] & 0x80)
m_vPosition.x -= 3.0f * fElapsedTime;
if(keyboardState[DIK_S] & 0x80)
m_vPosition.x += 3.0f * fElapsedTime;
if(keyboardState[DIK_A] & 0x80)
m_vPosition.z -= 3.0f * fElapsedTime;
if(keyboardState[DIK_D] & 0x80)
m_vPosition.z += 3.0f * fElapsedTime;
}
void CGame::Render(float fElapsedTime,float FPS)
{
// 在每次渲染前判断是否发生设备丢失
HRESULT hr;
// 后备缓冲区须与窗口大小一致才能正确获得D3DERR_DEVICENOTRESET
// 否则检测系统协调层级只能获得D3DERR_DEVICELOST
if( m_bDeviceLost == true )
{
Sleep( 100 ); // 100 milliseconds
// 检查系统协调层级,系统可以根据函数返回值判断设备丢失时采取的措施
if( FAILED( hr = m_pDevice->TestCooperativeLevel() ) )
{
if( hr == D3DERR_DEVICELOST )
return;
// 设备丢失能够被自动重置,这时候返回进行再次尝试
if( hr == D3DERR_DEVICENOTRESET )
{
// 清空内存资源
InvalidateDeviceObjects();
// 调用Reset函数重置设备
hr = m_pDevice->Reset( &m_d3dpp );
if( FAILED(hr ) )
return;
// 重新设置内存资源里的数据
RestoreDeviceObjects();
return;
}
}
m_bDeviceLost = false;
}
m_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
m_pDevice->BeginScene();
D3DXMATRIX matWorld, matMove;
D3DXMatrixRotationY( &matWorld, m_fRotAngle );
D3DXMatrixTranslation( &matMove, m_vPosition.x, m_vPosition.y, m_vPosition.z );
D3DXMatrixMultiply( &matWorld, &matWorld, &matMove );
m_pDevice->SetTransform(D3DTS_WORLD, &matWorld);
m_pBox->Render();
string str = "按键设定:\nUP X轴负向\nDOWN X轴正向\nLEFT Z轴负向\nRIGHT Z轴正向\n鼠标左键 正向旋转\n鼠标右键 负向旋转";
RECT rect;
SetRect(&rect, 10, 10, 300, 500);
RECT rect1;
SetRect(&rect1, 10, 100, 300, 500);
char p[32];
itoa((int)FPS,p,10);
m_pFont->DrawTextA( NULL, str.c_str(), static_cast<INT>(str.size()), &rect, DT_LEFT, 0xFF00FF00);
m_pFont->DrawTextA(NULL,p,sizeof(FPS),&rect1,DT_CENTER,0xff00ff00);
m_pDevice->EndScene();
hr = m_pDevice->Present( NULL, NULL, NULL, NULL );
if( hr == D3DERR_DEVICELOST )
m_bDeviceLost = true;
}
void CGame::InvalidateDeviceObjects(void)
{
m_pFont->OnLostDevice();
}
void CGame::RestoreDeviceObjects(void)
{
m_pFont->OnResetDevice();
}
void CGame::HandleMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_KEYDOWN:
switch (wParam)
{
case 'a':
MessageBox(hWnd,"asdf","fdsa",NULL);
break;
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -