⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 DirectInput的基本实现 只是基本应用
💻 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 + -