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

📄 input.cpp

📁 《OpenGL游戏编程》这本书的配套源码。
💻 CPP
字号:
//======================================================================
/**
*  @file      Input.cpp
*
*  项目描述: 构造游戏引擎
*   
*  文件描述:  输入系统类CInputSystem
*             其中,类CKeyboard、CMouse、CJoystick分别用来处理键盘、鼠标
*			  和游戏手柄,CInputSystem是输入设备的管理类。
*  适用平台: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  电子邮件:  wwboss123@gmail.com
*  创建日期: 2007-07-24	
*  修改日期: 2007-07-24
*/																			
//======================================================================

#include "stdafx.h"
#include "Input.h"


CKeyboard::CKeyboard(LPDIRECTINPUT8 pDI, HWND hwnd)
{
	if (FAILED(pDI->CreateDevice(GUID_SysKeyboard, &m_pDIDev, NULL)))
	{
		_ERROR("Failed to set data format<keyboard>");
	}

	if (FAILED(m_pDIDev->SetDataFormat(&c_dfDIKeyboard)))
	{
		_ERROR("Failed to set data format<keyboard>");
	}

	if (FAILED(m_pDIDev->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
	{
		_ERROR("Failed to set cooperative level<keyboard>");
	}

	if (FAILED(m_pDIDev->Acquire()))
	{
		_ERROR("Failed to acquire<keyboard>");
	}

	Clear();
}

CKeyboard::~CKeyboard()
{
	if (m_pDIDev)
	{
		m_pDIDev->Unacquire();
		m_pDIDev->Release();
	}
}


/**\brief
 * 更新键盘数据,放在主循环中
 */
BOOL CKeyboard::Update()
{
  if (FAILED(m_pDIDev->GetDeviceState(sizeof(m_keys), (LPVOID)m_keys)))
  {
		if (FAILED(m_pDIDev->Acquire()))return FALSE;

		if (FAILED(m_pDIDev->GetDeviceState(sizeof(m_keys),(LPVOID)m_keys)))return FALSE;
	}

	return TRUE;
}

////////////////////////////////////////////////
////////////////////////////////////////////////

CMouse::CMouse(LPDIRECTINPUT8 pDI, HWND hwnd, BOOL isExclusive)
{
	RECT r;
	GetClientRect(hwnd , &r);
	m_iWidth = r.right - r.left;
	m_iHeight = r.bottom - r.top;

	m_sMousePos.x=m_iWidth/2;
	m_sMousePos.y=m_iHeight/2;

	if (FAILED(pDI->CreateDevice(GUID_SysMouse, &m_pDIDev, NULL)))
	{
		_ERROR("Failed to create mouse device");
	}

	if (FAILED(m_pDIDev->SetDataFormat(&c_dfDIMouse)))
	{
		_ERROR("Failed to set data format<mouse>");
	}

	DWORD flags;

	if (isExclusive)
		flags = DISCL_FOREGROUND|DISCL_EXCLUSIVE|DISCL_NOWINKEY;
	else
		flags = DISCL_FOREGROUND|DISCL_NONEXCLUSIVE;


	if (FAILED(m_pDIDev->SetCooperativeLevel(hwnd, flags)))
	{
		_ERROR("Failed to set cooperative level<mouse>");
	}

	if (FAILED(m_pDIDev->Acquire()))
	{
		_ERROR("Failed to acquire<mouse>");
	}

	if (FAILED(m_pDIDev->GetDeviceState(sizeof(DIMOUSESTATE), &m_state)))
	{
		_ERROR("Failed to get device state<mouse>");
	}
}


CMouse::~CMouse()
{
	if (m_pDIDev)
	{
		m_pDIDev->Unacquire();
		m_pDIDev->Release();
	}
}


/**\brief
 * 更新鼠标参数
 */
BOOL CMouse::Update()
{
	if (FAILED(m_pDIDev->GetDeviceState(sizeof(DIMOUSESTATE), &m_state)))
	{
		if (FAILED(m_pDIDev->Acquire()))
		{
			return FALSE;
		}
		if (FAILED(m_pDIDev->GetDeviceState(sizeof(DIMOUSESTATE), &m_state)))
		{
			return FALSE;
		}
	}
 
	m_sMousePos.x+=m_state.lX;
	m_sMousePos.y-=m_state.lY;

	if(m_sMousePos.x<0)m_sMousePos.x=0;
	if(m_sMousePos.x>m_iWidth)m_sMousePos.x=m_iWidth;
	if(m_sMousePos.y<0)m_sMousePos.y=0;
	if(m_sMousePos.y>m_iHeight)m_sMousePos.y=m_iHeight;

  return TRUE;
}



///////////////////////////////////////////
///////////////////////////////////////////

CJoystick::CJoystick(LPDIRECTINPUT8 pDI, HINSTANCE appInstance)
{
}

CJoystick::~CJoystick()
{
	if (m_pDIDev)
	{
		m_pDIDev->Unacquire();
		m_pDIDev->Release();
	}
}



//////////////////////////////////
//////////////////////////////////
CInput* CInput::m_pInput=NULL;
HWND	CInput::m_hWnd=NULL;

/**\brief
 * 初始化输入设备
 */
BOOL CInput::Init(HWND hwnd,HINSTANCE appInstance,BOOL isExclusive,DWORD flags)
{
	m_pKeyboard = NULL; 
	m_pMouse = NULL; 
	m_pJoystick = NULL; 

	m_hWnd=hwnd;

	if (FAILED(DirectInput8Create(appInstance,
								DIRECTINPUT_VERSION,
								IID_IDirectInput8,
								(void **)&m_pDI,NULL)))
		return FALSE;

	if (flags & IS_USEKEYBOARD)
	{
		m_pKeyboard = new CKeyboard(m_pDI, hwnd);
	}
	if (flags & IS_USEMOUSE)
	{
		m_pMouse = new CMouse(m_pDI, hwnd, TRUE);
	}
	if (flags & IS_USEJOYSTICK)
	{
		m_pJoystick = new CJoystick(m_pDI, appInstance);
	}
	
	return TRUE;
}


/**\brief
 * 获得光标的3D坐标
 */
vector3d CInput::GetMousePosition()
{
	float depth[2];
	SPoint2 p;
	p=m_pMouse->GetMousePos();

	GLdouble x,y,z;
	glReadPixels(p.x,p.y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
	GLdouble model[16],project[16];
	glGetDoublev(GL_MODELVIEW_MATRIX,model);
	glGetDoublev(GL_PROJECTION_MATRIX,project);
	GLint viewport[4]={0,0,m_pMouse->m_iWidth,m_pMouse->m_iHeight};
	gluUnProject(p.x,p.y,depth[0],model,project,viewport,&x,&y,&z);

	return vector3d((float)x,(float)y,(float)z);
}


/**\brief
 * 更新输入设备的参数
 */
void CInput::Update()
{
	if (m_pKeyboard)	m_pKeyboard->Update();
	if (m_pMouse)		m_pMouse->Update();
	if (m_pJoystick)	m_pJoystick->Update();


	//-----用来记录Clicked事件------
	static BOOL bMouseLDown=FALSE;
	if(m_pMouse->ButtonDown(0)==TRUE)
	{
		bMouseLDown=TRUE;
		bClick=FALSE;
	}
	else if(bMouseLDown==TRUE&&m_pMouse->ButtonDown(0)==FALSE)
	{
		bMouseLDown=FALSE;
		bClick=TRUE;
	}
	else
	{
		bMouseLDown=FALSE;
		bClick=FALSE;
	}
	//------------------------------

	//--用来记录FirstMouseDownL事件--
	static BOOL bMouseLUp=TRUE;
	if(m_pMouse->ButtonDown(0)==FALSE)bMouseLUp=TRUE;
	if(m_pMouse->ButtonDown(0)==TRUE&&bMouseLUp==TRUE)
	{
		bFirstMDownL=TRUE;
		bMouseLUp=FALSE;
	}
	else bFirstMDownL=FALSE;
	//-------------------------------
	
}


/**\brief
 * 释放输入设备资源
 */
BOOL CInput::Shutdown()
{
  UnacquireAll();

  if (m_pKeyboard)_DELETE(m_pKeyboard);
  if (m_pKeyboard)_DELETE(m_pMouse);
  if (m_pJoystick)_DELETE(m_pJoystick);
  if (FAILED(m_pDI->Release()))return FALSE;

  return TRUE;
}

⌨️ 快捷键说明

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