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

📄 gameinput.cpp

📁 使用DirectX9 写的通用3D游戏框架
💻 CPP
字号:
#include "GameInput.h"

CGameInput* CGameInput::m_pInstance = NULL;

CGameInput::CGameInput()
{
	m_pDInput		= NULL;
	m_pKeyboard		= NULL;
	m_pMouse		= NULL;
}

CGameInput::~CGameInput()
{
	CleanUp();
}

CGameInput* CGameInput::GetInstance()
{
	if(m_pInstance == NULL)
		m_pInstance = new CGameInput;

	return m_pInstance;
}

LRESULT CGameInput::InitInput(DWORD keyboardCoopFlags, DWORD mouseCoopFlags, HINSTANCE hInstance, HWND hWnd)
{
	ZeroMemory(m_CurrKeyboardState, sizeof(m_CurrKeyboardState));
	ZeroMemory(m_PrevKeyboardState, sizeof(m_PrevKeyboardState));
	ZeroMemory(&m_CurrMouseState, sizeof(m_CurrMouseState));
	ZeroMemory(&m_PrevMouseState, sizeof(m_PrevMouseState));

	//创建DIRECTINPUT
	if(FAILED(DirectInput8Create(	hInstance, DIRECTINPUT_VERSION, 
									IID_IDirectInput8, (void**)&m_pDInput, 0)))
	{
		CleanUp();
		return E_FAIL;
	}

	//创建键盘
	if(FAILED(m_pDInput->CreateDevice(GUID_SysKeyboard, &m_pKeyboard, 0)))
	{
		CleanUp();
		return E_FAIL;
	}

	//设置键盘数据格式
	if(FAILED(m_pKeyboard->SetDataFormat(&c_dfDIKeyboard)))
	{
		CleanUp();
		return E_FAIL;
	}

	//设置键盘协调级别
	if(FAILED(m_pKeyboard->SetCooperativeLevel(hWnd, keyboardCoopFlags)))
	{
		CleanUp();
		return E_FAIL;
	}

	//获取键盘
	if(FAILED(m_pKeyboard->Acquire()))
	{
		CleanUp();
		return E_FAIL;
	}

	//创建鼠标
	if(FAILED(m_pDInput->CreateDevice(GUID_SysMouse, &m_pMouse, 0)))
	{
		CleanUp();
		return E_FAIL;
	}
	
	//设置鼠标数据格式
	if(FAILED(m_pMouse->SetDataFormat(&c_dfDIMouse2)))
	{
		CleanUp();
		return E_FAIL;
	}

	//设置鼠标协调级别
	if(m_pMouse->SetCooperativeLevel(hWnd, mouseCoopFlags))
	{
		CleanUp();
		return E_FAIL;
	}

	//获取鼠标
	if(FAILED(m_pMouse->Acquire()))
	{
		CleanUp();
		return E_FAIL;
	}

	return S_OK;
}

void CGameInput::Update()
{
	//保存键盘上一状态
	for(int i = 0; i < 256; i++)
	{
		m_PrevKeyboardState[i] = m_CurrKeyboardState[i];
	}

	//获取键盘输入
	HRESULT hr = m_pKeyboard->GetDeviceState(sizeof(m_CurrKeyboardState), (void**)&m_CurrKeyboardState); 
	if( FAILED(hr) )
	{
		//键盘丢失 清空键盘数据
		ZeroMemory(m_CurrKeyboardState, sizeof(m_CurrKeyboardState));

		//再次获取键盘
		hr = m_pKeyboard->Acquire();
	}

	//保存键盘上一状态
	m_PrevMouseState = m_CurrMouseState;

	//获取鼠标输入
	hr = m_pMouse->GetDeviceState(sizeof(DIMOUSESTATE2), (void**)&m_CurrMouseState); 
	if( FAILED(hr) )
	{
		//鼠标丢失 清空鼠标数据
		ZeroMemory(&m_CurrMouseState, sizeof(m_CurrMouseState));

		//再次获取鼠标
		hr = m_pMouse->Acquire(); 
	}
}

bool CGameInput::KeyDown(char key)
{
	return (m_CurrKeyboardState[key] & 0x80) != 0;
}

bool CGameInput::MouseButtonDown(int button)
{
	return (m_CurrMouseState.rgbButtons[button] & 0x80) != 0;
}

bool CGameInput::KeyClicked(char key)
{
	return ((m_CurrKeyboardState[key] & 0x80) != 0 && (m_PrevKeyboardState[key] & 0x80) == 0);
}

bool CGameInput::MouseButtonClicked(int button)
{
	return ((m_CurrMouseState.rgbButtons[button] & 0x80) != 0 && (m_PrevMouseState.rgbButtons[button] & 0x80) == 0);
}

float CGameInput::MouseDX()
{
	return (float)m_CurrMouseState.lX;
}

float CGameInput::MouseDY()
{
	return (float)m_CurrMouseState.lY;
}

float CGameInput::MouseDZ()
{
	return (float)m_CurrMouseState.lZ;
}

void CGameInput::CleanUp()
{
	SafeRelease(m_pDInput);

	m_pKeyboard->Unacquire();
	m_pMouse->Unacquire();

	SafeRelease(m_pKeyboard);
	SafeRelease(m_pMouse);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -