专题6 键盘和鼠标控制

上传人:mg****85 文档编号:49698920 上传时间:2018-08-01 格式:PPT 页数:43 大小:377KB
返回 下载 相关 举报
专题6 键盘和鼠标控制_第1页
第1页 / 共43页
专题6 键盘和鼠标控制_第2页
第2页 / 共43页
专题6 键盘和鼠标控制_第3页
第3页 / 共43页
专题6 键盘和鼠标控制_第4页
第4页 / 共43页
专题6 键盘和鼠标控制_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《专题6 键盘和鼠标控制》由会员分享,可在线阅读,更多相关《专题6 键盘和鼠标控制(43页珍藏版)》请在金锄头文库上搜索。

1、Copyright 2008 By Neusoft Group. All rights reserved专题6 键盘和鼠标控制抛砖引玉 交互性是游戏的最基本特征,玩家必须与计算机不断地交 互并得到反应,这才是完整的游戏体验。那么,玩家和游 戏如何进行交互? 目前很流行的游戏控制方式:w键前进,a键向左移动,s 键后退,d键向右移动,按下鼠标左键攻击,按住鼠标右 键转动视角 游戏控制是一款游戏的基本要素,没有对游戏的控制,玩 家和游戏就无从交互。Copyright 2008 By Neusoft Group. All rights reserved麻雀虽小,五脏俱全 传统游戏控制 DirectI

2、nput 简介 DirectX键盘控制 DirectX鼠标控制 游戏控制综合运用 Copyright 2008 By Neusoft Group. All rights reserved在Win32 API编程中 ,键盘和鼠标的用户 输入信息并不是直接 传递给应用程序来处 理的,而是转发回 Windows操作系统, 最后由Windows回调 应用程序的窗口过程 函数进行相应的消息 代码处理。这种处理 用户输入的方式,执 行效率低。Copyright 2008 By Neusoft Group. All rights reserved传统游戏控制case WM_KEYDOWN: switch (

3、wParam) case VK_LEFT: / 处理左箭头光标移动键的按键消息break; case VK_RIGHT: / 处理右箭头光标移动键的按键消息break; return 0; DirectInput是DirectX的一个组件接口,提供了 大量的接口函数处理用户在键盘、鼠标、游戏杆 以及力反馈等游戏装置上的输入。 DirectInput直接与硬件驱动程序通信,因此它可 以较快的处理用户的输入。并且在控制面板上做 的任何键盘和鼠标的属性设置(如键盘按键的延 迟重复率和鼠标的左右手习惯等),都不会对应 用DirectInput的程序起作用,除非是修改由驱动 程序提供的属性设置。Copy

4、right 2008 By Neusoft Group. All rights reservedDirectInput 简介DirectX键盘控制 创建IDirectInput接口对象 创建DirectInput设备对象 设置DirectInput设备的数据格式 设置DirectInput设备的协调级别 设置DirectInput设备的属性 获取输入设备的访问权 读取键盘的输入 关闭DirectInput,释放输入设备1、创建IDirectInput接口对象 在创建具体的输入设备对象之前,首先要利用 DirectInput8Create建立一个IDirectInput接口对象 。HRESULT

5、 DirectInput8Create( HINSTANCE hinst, /当前创建IDirectInput对象的应用程序句柄DWORD dwVersion, / DirectInput版本号,通常取值DIRECTINPUT_VERSION, 在当前的dinput.h头文件中, DIRECTINPUT_VERSION定义为0x0800REFIID riidltf, /指明所需创建的IDirectInput对象的唯一标志符,一般取值为IID_IDirectInput8LPVOID * ppvOut, /存放IDirectInput接口对象指针地址LPUNKNOWN punkOuter /一般取

6、值为NULL ); Copyright 2008 By Neusoft Group. All rights reserved例: DirectInput对象的创建步骤IDirectInput8* Input=0;HRESULT hr=0;hr = DirectInput8Create( hInstance, DIRECTINPUT_VERSION,IID_IDirectInput8,(void*)if(FAILED(hr) :MessageBox(0, “DirectInput8Create( ) - FAILED“, 0, 0); return false; Copyright 2008 B

7、y Neusoft Group. All rights reserved2、创建DirectInput设备对象 建立DirectInput接口对象之后,就可以利用 IDirectInput8接口所提供的CreateDevice函数,为键盘 、鼠标和游戏杆等输入装置建立一个对应的DirectInput 设备对象,此后就可用设备对象来读取用户的输入。HRESULT CreateDevice(REFGUID rguid, /所要创建的输入设备的标志符,键盘取值为GUID_SysKeyboard,鼠标取值为GUID_SysMouseLPDIRECTINPUTDEVICE * lplpDirectInp

8、utDevice, /创建的输入设备对象的指针的地址LPUNKNOWN pUnkOuter /一般取值为NULL);Copyright 2008 By Neusoft Group. All rights reserved 例:创建DirectInput键盘设备IDirectInputDevice8* InputDevice=0;hr=Input-CreateDevice(GUID_SysKeyboard, if(FAILED(hr):MessageBox(0, “CreateDevice()- Keyboard - FAILED“, 0, 0);d3d:Release(Input); /释放接

9、口return false; 例:创建DirectInput鼠标设备IDirectInputDevice8* InputDevice=0;hr=Input-CreateDevice(GUID_SysMouse, if(FAILED(hr):MessageBox(0, “CreateDevice ( )-Mouse-FAILED“, 0, 0);d3d:Release(Input); /释放接口return false; Copyright 2008 By Neusoft Group. All rights reserved3、设置DirectInput设备的数据格式 每种设备都有一种用于读取数

10、据的特定数据格式,因此要 使程序从设备读取数据,首先必须告诉 DirectInput读取这 种数据所采用的格式。可以用IDirectInputDevice8接口提 供的SetDataFormat函数实现。HRESULT SetDataFormat(LPCDIDATAFORMAT lpdf);lpdf 指向DIDATAFORMAT结构体,该结构体用来填写 DirectInput设备的属性值。可以用该结构体预先定义出来的全局变量 :c_dfDIKeyboard 、c_dfDIMouse 、c_dfDIMouse2、 c_dfDIJoystick 和c_dfDIJoystick2 来说明键盘、鼠标和

11、游戏杆设备 的数据格式。Copyright 2008 By Neusoft Group. All rights reserved 例:设置键盘设备的数据格式hr=InputDevice-SetDataFormat(if(FAILED(hr):MessageBox(0, “SetDataFormat( ) - FAILED“, 0, 0);d3d:Release(InputDevice); /释放接口d3d:Release(Input); /释放接口return false;Copyright 2008 By Neusoft Group. All rights reserved4、设置Direc

12、tInput设备的协调级别 如果同一个物理输入设备建立了多个DirectInput设备实例 ,必须处理这些实例相互间的协调级别。此外,还需要设 定设备实例与系统的其他对象的协调级别。这个协调级别 是通过IDirectInputDevice8接口的 SetCooperativeLevel函数实现。HRESULT SetCooperativeLevel ( HWND hwnd, /设备所属的窗口句柄DWORD dwFlags /协调级别标识);Copyright 2008 By Neusoft Group. All rights reserved协调级别标识dwFlags: DISCL_BACKG

13、ROUND:即使所属的窗口不是活动窗口 ,仍然可取得输入设备的数据 DISCL_EXCLUSIVE :独占输入设备,不过如果其他设 备采用非独占方式使用这个已被独占的输入设备,那么还 是允许的 DISCL_FOREGROUND:输入设备的输入数据只有在所 属窗口处于活动状态时才可读取 DISCL_NONEXCLUSIVE :非独占输入设备,其他 DirectInput设备实例可共享该输入设备的读取权 DISCL_NOWINKEY:使Windows的注销键失效,阻止 用户中断应用程序的运行 注意:协调级别标识 DISCL_BACKGROUND 和DISCL_EXCLUSIVE不能同时 使用,否则

14、,将导致设备的协调级别设置失败。Copyright 2008 By Neusoft Group. All rights reserved 例:将DirectInput设备的协调级别设置为 DISCL_FOREGROUND和DISCL_EXCLUSIVE。hr=InputDevice-SetCooperativeLevel(hwnd,DISCL_FOREGROUND | DISCL_EXCLUSIVE);if(FAILED(hr):MessageBox(0, “ SetCooperativeLevel( )-FAILED“, 0, 0);d3d:Release(InputDevice); /释放

15、接口d3d:Release(Input); /释放接口return false;Copyright 2008 By Neusoft Group. All rights reserved5、设置DirectInput设备的属性 前面介绍了用DirectX SDK预定义的全局变量: c_dfDIKeyboard 、c_dfDIMouse 、 c_dfDIMouse2、c_dfDIJoystick 和 c_dfDIJoystick2 来设置DirectInput设备(键盘、 鼠标和游戏杆)的数据格式,这种做法相当于设置 了DirectInput设备的一些默认属性。 下面介绍默认状态下的两个属性。Co

16、pyright 2008 By Neusoft Group. All rights reserved属性1:l 在默认的情形下,DirectInput设备以立即模式(如果按键 速度非常快,那么在DirectInput读取数据那一刻之前的按 键数据将不能被DirectInput设备读取)获取输入信息,与 立即模式相对应的是缓冲模式,此时设备输入数据将被放 进缓冲区中供DirectInput设备使用。l 对于游戏开发来说,通常依照键盘和游戏杆的各种按键执 行画面的更新,因此,多用DirectInput的立即模式来读取 它们的输入数据。相反的,在一个画面中鼠标的移动是连 贯的,为了使游戏程序可处理多次连续的鼠标移动量,就 需要采用DirectInput的缓冲模式来读取鼠标的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号