欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

input.h

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


#ifndef __INPUT_H__
#define __INPUT_H__

#define DIRECTINPUT_VERSION  0x0800
#include "stdafx.h"

#include <dinput.h>
#include "mathlib.h"

#define IS_USEKEYBOARD  1
#define IS_USEMOUSE     2
#define IS_USEJOYSTICK  4


/////////////////////////////////////////
/**\brief
 *  键盘类
 */
class CKeyboard
{
public:
	CKeyboard(LPDIRECTINPUT8 pDI, HWND hwnd);
	~CKeyboard();


	/**\brief
	 * key键是否按下
	 */
	BOOL KeyDown(int key);


	/**\brief
	 * 更新键盘数据,放在主循环中
	 */
	BOOL Update();


	/**\brief
	 * 对键盘数据清零
	 */
	void Clear();


	/**\brief
	 * 取键盘数据
	 */
	BOOL Acquire();


	/**\brief
	 * 停止取数据
	 */
	BOOL Unacquire();


private:
	//! 键盘设备
	LPDIRECTINPUTDEVICE8  m_pDIDev;

	//! 键盘数据区
	char    m_keys[256];
};




////////////////////////////////////////
/**\brief
 *  鼠标类
 */
class CMouse
{
public:
	CMouse(LPDIRECTINPUT8 pDI,HWND hwnd,BOOL isExclusive=TRUE);
	~CMouse();


	/**\brief
	 * 鼠标某键是否按下,0-左键,1-右键
	 */
	BOOL	ButtonDown(int button);
	
	
	/**\brief
	 * 获得光标坐标变化
	 */
	void	GetMovement(int &dx, int &dy);
	
	
	/**\brief
	 * 获得光标位置
	 */
	SPoint2	GetMousePos();


	/**\brief
	 * 获得鼠标滚轮状态,(<0,0,>0)
	 */
	int		GetWheelState();


	/**\brief
	 * 更新鼠标参数
	 */
	BOOL	Update();


	/**\beirf
	 * 取鼠标数据
	 */
	BOOL	Acquire();
	
	
	/**\brief
	 * 停止取数据
	 */
	BOOL	Unacquire();


	//! 窗口宽
	int		m_iWidth;

	//! 窗口高
	int		m_iHeight;


private:
	//! 鼠标设备
	LPDIRECTINPUTDEVICE8	m_pDIDev;

	//! 鼠标状态
	DIMOUSESTATE			m_state;

	//! 光标位置
	SPoint2					m_sMousePos;
};




/////////////////////////////////////////
/**\brief
 *  游戏手柄
 */
class CJoystick
{
public:
	CJoystick(LPDIRECTINPUT8 pDI, HINSTANCE appInstance);
	~CJoystick();


	/**\brief
	 * 更新手柄参数
	 */
	BOOL Update(){ return TRUE;}


	/**\brief
	 * 取手柄数据
	 */
	BOOL Acquire();


	/**\brief
	 * 停上取手柄数据
	 */
	BOOL Unacquire();


private:
	//! 手柄设备
	LPDIRECTINPUTDEVICE8  m_pDIDev;
};




////////////////////////////////////////
/**\brief
 *  输入系统类
 */
class CInput
{
public:
	CInput():bClick(FALSE),bFirstMDownL(FALSE){m_pInput=this;}
	~CInput(){Shutdown();}

	
	/**\brief
	 * 初始化输入设备
	 */
	BOOL  Init(HWND hwnd,HINSTANCE appInstance,BOOL isExclusive,DWORD flags=0);
	
	
	/**\brief
	 * 释放输入设备资源
	 */
	BOOL  Shutdown();


	/**\brief
	 * 取输入设备的数据
	 */
	void  AcquireAll();
	
	
	/**\brief
	 * 停上取输入设备的数据
	 */
	void  UnacquireAll();


	/**\brief
	 * 获得键盘
	 */
	CKeyboard  *GetKeyboard(){return m_pKeyboard;}
	
	
	/**\brief
	 * 获得鼠标
	 */
	CMouse     *GetMouse(){return m_pMouse;}
	
	
	/**\brief
	 * 获得游戏手柄
	 */
	CJoystick  *GetJoystick(){return m_pJoystick;}


	/**\brief
	 * 更新输入设备的参数
	 */
	void	Update();


	/**\brief
	 * 获得光标的3D坐标
	 */
	vector3d GetMousePosition();


	/**\brief
	 * 鼠标是否是第一次按下
	 */
	BOOL	FirstMouseDownL(){return bFirstMDownL;}


	/**\brief
	 * 是否单击了鼠标
	 */
	BOOL	Clicked(){return bClick;}
	

	/**\brief
	 * 得到当前的输入设备
	 */
	static CInput* GetSysInput(){return m_pInput;}


	/**\brief
	 * 得到当前的窗口句柄
	 */
	static HWND GetSysHWnd(){return m_hWnd;}


private:
	//! 输入系统
	static CInput* m_pInput;

	//! 窗口句柄
	static HWND m_hWnd;

	//! 键盘
	CKeyboard  *m_pKeyboard;

	//! 鼠标
	CMouse     *m_pMouse;

	//! 游戏手柄
	CJoystick  *m_pJoystick;

	//! 输入设备
	LPDIRECTINPUT8 m_pDI;

	//鼠标左键按下后抬起时为TRUE
	BOOL		bClick;

	//鼠标按下会有个时间段,是不是刚开始按下
	BOOL		bFirstMDownL;
	
};







///////////////////////////////////////////////////
//------------CKeyboard inline函数实现-------------

/**\brief
 * key键是否按下
 */
inline BOOL CKeyboard::KeyDown(int key)
{
	return (m_keys[key]&0x80)?TRUE:FALSE;
}

/**\brief
 * 对键盘数据清零
 */
inline void CKeyboard::Clear()
{
	ZeroMemory(m_keys,256*sizeof(char));
}

/**\brief
 * 取键盘数据
 */
inline BOOL CKeyboard::Acquire()
{
	Clear();
	return (!FAILED(m_pDIDev->Acquire()));
}

/**\brief
 * 停止取数据
 */
inline BOOL CKeyboard::Unacquire()
{
	Clear();
	return (!FAILED(m_pDIDev->Unacquire()));
}



///////////////////////////////////////////////////
//------------CMouse inline函数实现----------------

/**\brief
 * 鼠标某键是否按下,0-左键,1-右键
 */
inline BOOL CMouse::ButtonDown(int button)
{
	return (m_state.rgbButtons[button]&0x80)?TRUE:FALSE;
}

/**\brief
 * 获得光标坐标变化
 */
inline void CMouse::GetMovement(int &dx, int &dy)
{
	dx = m_state.lX;
	dy = m_state.lY;
}

/**\brief
 * 获得光标位置
 */
inline SPoint2 CMouse::GetMousePos()
{
	return m_sMousePos;
}

/**\brief
 * 获得鼠标滚轮状态 (<0,0,>0)
 */
inline int	CMouse::GetWheelState()
{
	return m_state.lZ;
}

/**\beirf
 * 取鼠标数据
 */
inline BOOL CMouse::Acquire()
{
	return (!FAILED(m_pDIDev->Acquire()));
}

/**\brief
 * 停止取数据
 */
inline BOOL CMouse::Unacquire()
{
	return (!FAILED(m_pDIDev->Unacquire()));
}



///////////////////////////////////////////////////
//-----------CJoystick inline函数实现--------------
/**\brief
 * 取手柄数据
 */
inline BOOL CJoystick::Acquire()
{
	return (!FAILED(m_pDIDev->Acquire()));
}

/**\brief
 * 停止取数据
 */
inline BOOL CJoystick::Unacquire()
{
	return (!FAILED(m_pDIDev->Unacquire()));
}



///////////////////////////////////////////////////
//-------------CInput inline函数实现---------------

/**\brief
 * 取输入设备的数据
 */
inline void CInput::AcquireAll()
{
	if (m_pKeyboard)	m_pKeyboard->Acquire();
	if (m_pMouse)		m_pMouse->Acquire();
	if (m_pJoystick)	m_pJoystick->Acquire();
}

/**\brief
 * 停止取数据
 */
inline void CInput::UnacquireAll()
{
	if (m_pKeyboard)	m_pKeyboard->Unacquire();
	if (m_pMouse)		m_pMouse->Unacquire();
	if (m_pJoystick)	m_pJoystick->Unacquire();
}



#endif

⌨️ 快捷键说明

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