3.2 Input Devices with cInputDevice

来源:互联网 发布:神优化的游戏 编辑:程序博客网 时间:2024/06/04 08:48
 

3.2 Input Devices with cInputDevice

这才是真正的重点。cInputDevice用于初始化一个指定的输入设备(如键盘、鼠标、游戏杆),并返回一些可以用到你游戏中的设备信息。

class cInputDevice

{

public:

cInput *m_Input; // cInput父类

short m_Type; // 设备类型

// MOUSE, KEYBOARD,

// or JOYSTICK

IDirectInputDevice8 *m_pDIDevice; // COM 设备接口

BOOL m_Windowed; // 如果使用窗口则是TRUE

// 鼠标读取方法

//  或如果正在使用DirectInput 方法返回FALSE

char m_State[256]; // 所有的键值和按钮

DIMOUSESTATE *m_MouseState; // 鼠标状态

DIJOYSTATE *m_JoystickState; // 游戏杆状态

BOOL m_Locks[256]; // 标志键是否被锁定

// 鼠标或游戏干的坐标

long m_XPos, m_YPos;

// 内部枚举函数

static BOOL FAR PASCAL EnumJoysticks( /

LPCDIDEVICEINSTANCE pdInst, LPVOID pvRef);

 

public:

cInputDevice(); // 构造函数

~cInputDevice(); // 析构函数

IDirectInputDevice8 *DeviceCOM(); // 返回 COM 对象

// 创建和释放一个设备接口

BOOL Create(cInput *Input, short Type, /

BOOL Windowed = TRUE);

BOOL Free();

BOOL Clear(); // 清空设备数据

BOOL Read(); // 返回设备数据

BOOL Acquire(BOOL Active = TRUE); // 获得或失去设备

BOOL GetLock(char Num); // 获得锁定键状态

BOOL SetLock(char Num, BOOL State = TRUE); //设置锁定状态

long GetXPos(); // 获得鼠标或游戏干的x坐标

BOOL SetXPos(long XPos); //设置x坐标

long GetYPos(); //获得鼠标或游戏干的y坐标

BOOL SetYPos(long YPos); //设置y坐标

long GetXDelta(); // Get x delta (relative movement)(获得相对移动x坐标)

long GetYDelta(); // Get y delta (relative movement)(获得相对移动Y坐标)

 

// 键盘指定方法

BOOL GetKeyState(char Num); // 返回键状态

// TRUE=按下 or FALSE=释放

// Num 参数= KEY_* or DIK_*

BOOL SetKeyState(char Num, BOOL State); // 设置键状态

BOOL GetPureKeyState(char Num); // 获得键状态

short GetKeypress(long TimeOut = 0); // 等待键按下并返回ASCLL

long GetNumKeyPresses(); // 获得当前按下的键的数量

long GetNumPureKeyPresses();// Get # keys pressed w/o locks

 

//鼠标游戏杆指定方法

BOOL GetButtonState(char Num); // 获得按钮状态

// Num=LBUTTON, RBUTTON, MBUTTON

BOOL SetButtonState(char Num, BOOL State); // 设置状态

BOOL GetPureButtonState(char Num); //获得锁定状态

long GetNumButtonPresses(); //获得按下按钮的数量

long GetNumPureButtonPresses(); // Get # pressed w/o locks

};

 

这就是整个cInputDevice类了,它包含了所有设备:键盘、鼠标、游戏杆,在一个干净的整洁的不掺水的包里面。这个类对象需要调用cInputDevice::Create来工作,并要通过一个已经初始化过的cInput对象。你也需要通知这个类你要创建那种类型(Type)的设备(KEYBOARDMOUSE,或JOYSTICK)。最后一点,你需要通知这个类是否要使用DirectInput的设备读取函数(device-reading function)还是Window的设备读取函数。如果设置windowedTRUE,将强制使用Window的设备读取函数,当WindowedFALSE,将强制使用DirectInput的设备读取函数。请确定你指定了一个TRUEWindowed;

 

接下来,你可以调用cInputDevice::Read用来读取当前被考虑的设备的状态。这时你就可以使用cInputDevice::GetKeyState, cInputDevice::GetButtonState, cInputDevice::GetPureKeyState, cInputDevice::GetPureButtonState来检验每个单独的按钮的状态。

 

要用一个pure函数的原因是因为键或按钮是可以被锁定的。一个锁定的键或按钮在释放之前不能被触发。不管所定的状态来读取pure

 

如果一个键正在被按下则GetKeyStateGetButtonState将返回TRUE,反之返回FALSE

NUM参数表示要验证的键。键的名称,带有KEY_前缀,比如KEY_ESCKEY_A

你可以看下Core_Input.h来找到KEY_的所有值(或者DIK_A等等DirectInput所支持的类型)。

 

鼠标引用的键:MOUSE_LBUTTON(左键)MOUSE_RBUTTON(右键),MOUSE_MBUTTON(中键)。对于游戏杆。。。我就不翻译了。

 

原创粉丝点击