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)的设备(KEYBOARD,MOUSE,或JOYSTICK)。最后一点,你需要通知这个类是否要使用DirectInput的设备读取函数(device-reading function)还是Window的设备读取函数。如果设置windowed为TRUE,将强制使用Window的设备读取函数,当Windowed为FALSE,将强制使用DirectInput的设备读取函数。请确定你指定了一个TRUE给Windowed;
接下来,你可以调用cInputDevice::Read用来读取当前被考虑的设备的状态。这时你就可以使用cInputDevice::GetKeyState, cInputDevice::GetButtonState, cInputDevice::GetPureKeyState, cInputDevice::GetPureButtonState来检验每个单独的按钮的状态。
要用一个pure函数的原因是因为键或按钮是可以被锁定的。一个锁定的键或按钮在释放之前不能被触发。不管所定的状态来读取pure值
如果一个键正在被按下则GetKeyState或GetButtonState将返回TRUE,反之返回FALSE。
NUM参数表示要验证的键。键的名称,带有KEY_前缀,比如KEY_ESC或KEY_A。
你可以看下Core_Input.h来找到KEY_的所有值(或者DIK_A等等DirectInput所支持的类型)。
鼠标引用的键:MOUSE_LBUTTON(左键),MOUSE_RBUTTON(右键),MOUSE_MBUTTON(中键)。对于游戏杆。。。我就不翻译了。