
专题6 键盘和鼠标控制.ppt
43页专题6 键盘和鼠标控制,抛砖引玉,交互性是游戏的最基本特征,玩家必须与计算机不断地交互并得到反应,这才是完整的游戏体验那么,玩家和游戏如何进行交互?目前很流行的游戏控制方式:w键前进,a键向左移动,s键后退,d键向右移动,按下鼠标左键攻击,按住鼠标右键转动视角……游戏控制是一款游戏的基本要素,没有对游戏的控制,玩家和游戏就无从交互麻雀虽小,五脏俱全,传统游戏控制DirectInput 简介DirectX键盘控制DirectX鼠标控制游戏控制综合运用,在Win32 API编程中,键盘和鼠标的用户输入信息并不是直接传递给应用程序来处理的,而是转发回Windows操作系统,最后由Windows回调应用程序的窗口过程函数进行相应的消息代码处理这种处理用户输入的方式,执行效率低传统游戏控制,case WM_KEYDOWN: switch (wParam) { case VK_LEFT: // 处理左箭头光标移动键的按键消息 break; case VK_RIGHT: // 处理右箭头光标移动键的按键消息 break; } return 0;,DirectInput是DirectX的一个组件接口,提供了大量的接口函数处理用户在键盘、鼠标、游戏杆以及力反馈等游戏装置上的输入。
DirectInput直接与硬件驱动程序通信,因此它可以较快的处理用户的输入并且在控制面板上做的任何键盘和鼠标的属性设置(如键盘按键的延迟重复率和鼠标的左右手习惯等),都不会对应用DirectInput的程序起作用,除非是修改由驱动程序提供的属性设置DirectInput 简介,DirectX键盘控制,创建IDirectInput接口对象创建DirectInput设备对象设置DirectInput设备的数据格式设置DirectInput设备的协调级别设置DirectInput设备的属性获取输入设备的访问权读取键盘的输入关闭DirectInput,释放输入设备,1、创建IDirectInput接口对象,在创建具体的输入设备对象之前,首先要利用DirectInput8Create建立一个IDirectInput接口对象HRESULT DirectInput8Create( HINSTANCE hinst, //当前创建IDirectInput对象的应用程序句柄 DWORD dwVersion, // DirectInput版本号,通常取值DIRECTINPUT_VERSION, 在当前的dinput.h头文件中, DIRECTINPUT_VERSION定义为0x0800 REFIID riidltf, //指明所需创建的IDirectInput对象的唯一标志符, 一般取值为IID_IDirectInput8 LPVOID * ppvOut, //存放IDirectInput接口对象指针地址 LPUNKNOWN punkOuter //一般取值为NULL);,,例: DirectInput对象的创建步骤 IDirectInput8* Input=0; HRESULT hr=0; hr = DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&Input, NULL); if(FAILED(hr)) { ::MessageBox(0, "DirectInput8Create( ) - FAILED", 0, 0); return false; },2、创建DirectInput设备对象,建立DirectInput接口对象之后,就可以利用IDirectInput8接口所提供的CreateDevice函数,为键盘、鼠标和游戏杆等输入装置建立一个对应的DirectInput设备对象,此后就可用设备对象来读取用户的输入。
HRESULT CreateDevice( REFGUID rguid, //所要创建的输入设备的标志符,键盘取值为 GUID_SysKeyboard,鼠标取值为GUID_SysMouse LPDIRECTINPUTDEVICE * lplpDirectInputDevice, //创建的输入设备对象的指针的地址 LPUNKNOWN pUnkOuter //一般取值为NULL );,例:创建DirectInput键盘设备 IDirectInputDevice8* InputDevice=0; hr=Input->CreateDevice(GUID_SysKeyboard, &InputDevice, NULL); if(FAILED(hr)) { ::MessageBox(0, "CreateDevice()- Keyboard - FAILED", 0, 0); d3d::Release
可以用IDirectInputDevice8接口提供的SetDataFormat函数实现HRESULT SetDataFormat( LPCDIDATAFORMAT lpdf );,√lpdf — 指向DIDATAFORMAT结构体,该结构体用来填写DirectInput设备的属性值可以用该结构体预先定义出来的全局变量:c_dfDIKeyboard 、c_dfDIMouse 、c_dfDIMouse2、c_dfDIJoystick 和c_dfDIJoystick2 来说明键盘、鼠标和游戏杆设备的数据格式例:设置键盘设备的数据格式 hr=InputDevice->SetDataFormat(&c_dfDIKeyboard); if(FAILED(hr)) { ::MessageBox(0, "SetDataFormat( ) - FAILED", 0, 0); d3d::Release
此外,还需要设定设备实例与系统的其他对象的协调级别这个协调级别是通过IDirectInputDevice8接口的 SetCooperativeLevel函数实现HRESULT SetCooperativeLevel ( HWND hwnd, //设备所属的窗口句柄 DWORD dwFlags //协调级别标识 );,协调级别标识dwFlags:DISCL_BACKGROUND:即使所属的窗口不是活动窗口,仍然可取得输入设备的数据DISCL_EXCLUSIVE :独占输入设备,不过如果其他设备采用非独占方式使用这个已被独占的输入设备,那么还是允许的DISCL_FOREGROUND:输入设备的输入数据只有在所属窗口处于活动状态时才可读取DISCL_NONEXCLUSIVE :非独占输入设备,其他 DirectInput设备实例可共享该输入设备的读取权DISCL_NOWINKEY:使Windows的注销键失效,阻止用户中断应用程序的运行,注意:协调级别标识 DISCL_BACKGROUND 和DISCL_EXCLUSIVE不能同时使用,否则,将导致设备的协调级别设置失败。
例:将DirectInput设备的协调级别设置为DISCL_FOREGROUND和DISCL_EXCLUSIVE hr=InputDevice->SetCooperativeLevel( hwnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE ); if(FAILED(hr)) { ::MessageBox(0, " SetCooperativeLevel( )-FAILED", 0, 0); d3d::Release
下面介绍默认状态下的两个属性属性1:,在默认的情形下,DirectInput设备以立即模式(如果按键速度非常快,那么在DirectInput读取数据那一刻之前的按键数据将不能被DirectInput设备读取)获取输入信息,与立即模式相对应的是缓冲模式,此时设备输入数据将被放进缓冲区中供DirectInput设备使用 对于游戏开发来说,通常依照键盘和游戏杆的各种按键执行画面的更新,因此,多用DirectInput的立即模式来读取它们的输入数据相反的,在一个画面中鼠标的移动是连贯的,为了使游戏程序可处理多次连续的鼠标移动量,就需要采用DirectInput的缓冲模式来读取鼠标的输入。












