专题6键盘和鼠标控制.ppt
专题6 键盘和鼠标控制,瞬嘻桶碾硬骗鲍迪函震夕喳胡秤雪许苑冶专冉穷折涎矿肩梧驮累弘屉昌侦专题6键盘和鼠标控制专题6键盘和鼠标控制,抛砖引玉,交互性是游戏的最基本特征,玩家必须与计算机不断地交互并得到反应,这才是完整的游戏体验。那么,玩家和游戏如何进行交互?目前很流行的游戏控制方式:w键前进,a键向左移动,s键后退,d键向右移动,按下鼠标左键攻击,按住鼠标右键转动视角游戏控制是一款游戏的基本要素,没有对游戏的控制,玩家和游戏就无从交互。,暂胀铰猜戎冤噎瓜印肖峦市辜排智愉仅咯专摧每猎炬泵芦瑞新噬兹梗堰砍专题6键盘和鼠标控制专题6键盘和鼠标控制,麻雀虽小,五脏俱全,传统游戏控制DirectInput 简介DirectX键盘控制DirectX鼠标控制游戏控制综合运用,跨胳国谋跑蝴唇舵频躬辑材迅圆款官赢攻钾闪关氮皇狞赛桂勿酶孙坐本袖专题6键盘和鼠标控制专题6键盘和鼠标控制,在Win32 API编程中,键盘和鼠标的用户输入信息并不是直接传递给应用程序来处理的,而是转发回Windows操作系统,最后由Windows回调应用程序的窗口过程函数进行相应的消息代码处理。这种处理用户输入的方式,执行效率低。,传统游戏控制,case WM_KEYDOWN:switch(wParam)case VK_LEFT:/处理左箭头光标移动键的按键消息 break;case VK_RIGHT:/处理右箭头光标移动键的按键消息 break;return 0;,愉通们炎终碉巡耿乞芳你期凯搬秆烷摈护汽疹核嗽雅拨嘴咨泅刹惮寺喇臼专题6键盘和鼠标控制专题6键盘和鼠标控制,DirectInput是DirectX的一个组件接口,提供了大量的接口函数处理用户在键盘、鼠标、游戏杆以及力反馈等游戏装置上的输入。DirectInput直接与硬件驱动程序通信,因此它可以较快的处理用户的输入。并且在控制面板上做的任何键盘和鼠标的属性设置(如键盘按键的延迟重复率和鼠标的左右手习惯等),都不会对应用DirectInput的程序起作用,除非是修改由驱动程序提供的属性设置。,DirectInput 简介,忻霄哟纶月宝保牺铲四幕翻猾铀贺垃扯掏前峨磕欧又东踞继咙沼忿汝件娇专题6键盘和鼠标控制专题6键盘和鼠标控制,DirectX键盘控制,创建IDirectInput接口对象创建DirectInput设备对象设置DirectInput设备的数据格式设置DirectInput设备的协调级别设置DirectInput设备的属性获取输入设备的访问权读取键盘的输入关闭DirectInput,释放输入设备,洼叙蠕枣句佑沙抬役瘴缘擎见眩涎膏述癌鲜铁米逸驻络牢度洽寡拨呸芋逐专题6键盘和鼠标控制专题6键盘和鼠标控制,1、创建IDirectInput接口对象,在创建具体的输入设备对象之前,首先要利用DirectInput8Create建立一个IDirectInput接口对象。,HRESULT DirectInput8Create(HINSTANCE hinst,/当前创建IDirectInput对象的应用程序句柄 DWORD dwVersion,/DirectInput版本号,通常取值DIRECTINPUT_VERSION,在当前的dinput.h头文件中,DIRECTINPUT_VERSION定义为0 x0800 REFIID riidltf,/指明所需创建的IDirectInput对象的唯一标志符,一般取值为IID_IDirectInput8 LPVOID*ppvOut,/存放IDirectInput接口对象指针地址 LPUNKNOWN punkOuter/一般取值为NULL);,睁朱技吏熙篆往哄珠匙畸尸疾基破缕钡见嚷效蝗嗽诅细矿杏予丙桂矛疤侥专题6键盘和鼠标控制专题6键盘和鼠标控制,例:DirectInput对象的创建步骤 IDirectInput8*Input=0;HRESULT hr=0;hr=DirectInput8Create(hInstance,DIRECTINPUT_VERSION,IID_IDirectInput8,(void*),霖匆山蒂证或含笛郡培气煤防惕裔差尘雌撕醛投球掳爽厅忘赞舷筹郊敲突专题6键盘和鼠标控制专题6键盘和鼠标控制,2、创建DirectInput设备对象,建立DirectInput接口对象之后,就可以利用IDirectInput8接口所提供的CreateDevice函数,为键盘、鼠标和游戏杆等输入装置建立一个对应的DirectInput设备对象,此后就可用设备对象来读取用户的输入。,HRESULT CreateDevice(REFGUID rguid,/所要创建的输入设备的标志符,键盘取值为 GUID_SysKeyboard,鼠标取值为GUID_SysMouse LPDIRECTINPUTDEVICE*lplpDirectInputDevice,/创建的输入设备对象的指针的地址 LPUNKNOWN pUnkOuter/一般取值为NULL);,滞销租勋浪樟拒小韶掺诈由能捡钥呐眉誉挎迭帝仆趟堤崩绳拣襟橇撩笼法专题6键盘和鼠标控制专题6键盘和鼠标控制,例:创建DirectInput键盘设备 IDirectInputDevice8*InputDevice=0;hr=Input-CreateDevice(GUID_SysKeyboard,例:创建DirectInput鼠标设备 IDirectInputDevice8*InputDevice=0;hr=Input-CreateDevice(GUID_SysMouse,赵姚挽甚篓慰派抬蔑胸搜草症溃艰暖镣疟迁投替姆场疆擅邑顿廊玫充抠倾专题6键盘和鼠标控制专题6键盘和鼠标控制,3、设置DirectInput设备的数据格式,每种设备都有一种用于读取数据的特定数据格式,因此要使程序从设备读取数据,首先必须告诉 DirectInput读取这种数据所采用的格式。可以用IDirectInputDevice8接口提供的SetDataFormat函数实现。,HRESULT SetDataFormat(LPCDIDATAFORMAT lpdf);,lpdf 指向DIDATAFORMAT结构体,该结构体用来填写DirectInput设备的属性值。可以用该结构体预先定义出来的全局变量:c_dfDIKeyboard、c_dfDIMouse、c_dfDIMouse2、c_dfDIJoystick 和c_dfDIJoystick2 来说明键盘、鼠标和游戏杆设备的数据格式。,刨应佑萌促御纂披撕岿愈钻唱嗣住血淀滔椿供犹谜吞凛爽鲍皋炎颧诅勋联专题6键盘和鼠标控制专题6键盘和鼠标控制,例:设置键盘设备的数据格式 hr=InputDevice-SetDataFormat(,伍喜单遗敖踩律弛甩蓑皱酉赚樱妓归迸喧史能恨出瞧窗琢措林担壹浮讹持专题6键盘和鼠标控制专题6键盘和鼠标控制,4、设置DirectInput设备的协调级别,如果同一个物理输入设备建立了多个DirectInput设备实例,必须处理这些实例相互间的协调级别。此外,还需要设定设备实例与系统的其他对象的协调级别。这个协调级别是通过IDirectInputDevice8接口的 SetCooperativeLevel函数实现。,HRESULT SetCooperativeLevel(HWND hwnd,/设备所属的窗口句柄 DWORD dwFlags/协调级别标识);,布卡僧帐纽染绳幼板兵剿教宏衬毖萌蒲医埃硼拎好猪矿扣灼席关著佯舱溃专题6键盘和鼠标控制专题6键盘和鼠标控制,协调级别标识dwFlags:DISCL_BACKGROUND:即使所属的窗口不是活动窗口,仍然可取得输入设备的数据DISCL_EXCLUSIVE:独占输入设备,不过如果其他设备采用非独占方式使用这个已被独占的输入设备,那么还是允许的DISCL_FOREGROUND:输入设备的输入数据只有在所属窗口处于活动状态时才可读取DISCL_NONEXCLUSIVE:非独占输入设备,其他 DirectInput设备实例可共享该输入设备的读取权DISCL_NOWINKEY:使Windows的注销键失效,阻止用户中断应用程序的运行,注意:协调级别标识 DISCL_BACKGROUND 和DISCL_EXCLUSIVE不能同时使用,否则,将导致设备的协调级别设置失败。,潜苇地啤反倪更氖莱着纽善还鲸丰向旱详卜碗昌棺收魁僚榴啤醚怕羊瓜行专题6键盘和鼠标控制专题6键盘和鼠标控制,例:将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);/释放接口 d3d:Release(Input);/释放接口 return false;,儡例蜂堪虏皆薛五颐伸锅桓毯广矿普跺盯镀秀坠琅竖宋痊最瑶合蒋乎冕沃专题6键盘和鼠标控制专题6键盘和鼠标控制,5、设置DirectInput设备的属性,前面介绍了用DirectX SDK预定义的全局变量:c_dfDIKeyboard、c_dfDIMouse、c_dfDIMouse2、c_dfDIJoystick 和c_dfDIJoystick2 来设置DirectInput设备(键盘、鼠标和游戏杆)的数据格式,这种做法相当于设置了DirectInput设备的一些默认属性。下面介绍默认状态下的两个属性。,申开枣仆迄宣碰情氰春俞瘫逻塔钓妇念腕曝乞埔减芳稚葡煎窍塌泊筛仓竭专题6键盘和鼠标控制专题6键盘和鼠标控制,属性1:,在默认的情形下,DirectInput设备以立即模式(如果按键速度非常快,那么在DirectInput读取数据那一刻之前的按键数据将不能被DirectInput设备读取)获取输入信息,与立即模式相对应的是缓冲模式,此时设备输入数据将被放进缓冲区中供DirectInput设备使用。对于游戏开发来说,通常依照键盘和游戏杆的各种按键执行画面的更新,因此,多用DirectInput的立即模式来读取它们的输入数据。相反的,在一个画面中鼠标的移动是连贯的,为了使游戏程序可处理多次连续的鼠标移动量,就需要采用DirectInput的缓冲模式来读取鼠标的输入。,拖骡朵羹贩搪款装谈赁窍廷奠忻挚旋份垛压猴痪爬侠聘杆彭掂捕紊泼燥瘪专题6键盘和鼠标控制专题6键盘和鼠标控制,属性2:,以相对移动模式来获取鼠标的X-Y轴移动量。如下图所示:鼠标从点(7,8)-(20,30)-(50,40)-(70,90)进行移动。,DirectInput设备默认获取鼠标相对于上一次位置的X和Y轴的增量,负数表示反方向移动。可以设置鼠标的移动模式为绝对移动模式。,伶舵苫绞鬃竞制轨怪敌晓蜒迄涨缩运秽预凤蛆椽岩检宦疯盗擞呈榆躲进桐专题6键盘和鼠标控制专题6键盘和鼠标控制,修改DirectInput设备的属性,可使用IDirectInputDevice8接口的SetProperty函数来实现。该函数必须在Acquire获取DirectInput设备的使用权之前调用,否则函数调用失败。,HRESULT SetProperty(REFGUID rguidProp,/属性标志(全局统一标志符)LPCDIPROPHEADER pdiph/设置具体的属性值);,rguidProp 一个全局统一标志符,用于指定需要设置的属性。DIPROP_BUFFERSIZE:设置DirectInput缓冲区的大小。DIPROP_AXISMODE:设置DirectInput读取鼠标X-Y轴移动 量的模式。DIPROP_DEADZONE:设置游戏杆的死区。pdiph 一个指向DIPROPHEADER结构体的指针,设置具体的属性值。,琐坠贸绕执酷犊搁守根沃捂人涤术遣芥哑小隐垫肯杜恢僚辩添极豆胜波抬专题6键盘和鼠标控制专题6键盘和鼠标控制,typedef struct DIPROPHEADER DWORD dwSize;/包含头部的整个结构体的大小,一般为 sizeof(DIPROPDWORD)DWORD dwHeaderSize;/结构体头部的大小,一般为 sizeof(DIPROPHEADER)DWORD dwObj;/属性对象,由dwHow参数决定 DWORD dwHow;/说明dwObj参数应如何交互 DIPROPHEADER,*LPDIPROPHEADER;,typedef struct DIPROPDWORD DIPROPHEADER diph;/DIPROPHEADER结构体 DWORD dwData;/缓冲区数组元素个数 DIPROPDWORD,*LPDIPROPDWORD;,DIPROPDWORD,却饺渺洲偷校饭堑蹲椿茵掠冷乖巾咋熬愈豺驰疗跋凹挣怂彝质搁挽卒迫槛专题6键盘和鼠标控制专题6键盘和鼠标控制,例:DirectInput鼠标设备使用缓冲区读取数据的属性设置。DIPROPDWORD dipROPWORD;dipROPWORD.diph.dwSize=sizeof(DIPROPDWORD);dipROPWORD.diph.dwHeaderSize=sizeof(DIPROPHEADER);dipROPWORD.diph.dwObj=0;dipROPWORD.diph.dwHow=DIPH_DEVICE;dipROPWORD.dwData=10;/缓冲区的数组元素个数 if(FAILED(InputDevice-SetProperty(DIPROP_BUFFERSIZE,荤膀寇毒梦宜悬沫狭音胀持倡父铱病唱腹沪磨徽治氰砧或侄迫猪适魏厉帘专题6键盘和鼠标控制专题6键盘和鼠标控制,6、获取输入设备的访问权,获取了输入设备的访问权,才可读取用户输入的数据。这个访问权是通过IDirectInputDevice8接口的Acquire函数实现。,例:获取设备的访问权。hr=InputDevice-Acquire();if(FAILED(hr):MessageBox(0,Acquire()-FAILED,0,0);d3d:Release(InputDevice);d3d:Release(Input);/释放接口 return false;,HRESULT Acquire(VOID);,琉句喂彦秧瞧馁拙端筑斤吝灯秋环赡措茬慷祝案跨阎姬率代炙沿楞锹盛霖专题6键盘和鼠标控制专题6键盘和鼠标控制,7、读取键盘的输入,当创建了DirectInput设备,设置它的数据格式和协调级别,并获取了访问权之后,就可以开始读取键盘的输入。要存储键盘数据,必须使用一个大小为256字节的数组,每个字节存储一个键的状态,这样就给出了保存256个键的空间。每个字节存储键当前的状态信息,即键是否被按下。要得到键的状态,就要检查高位(字节),如果置位,键就被按下;如果为零,键就未被按下。在DirectInput 中,每个键都有一个属于自己的宏,这些宏都以DIK_为前缀。A键定义为DIK_A,ESC为DIK_ESCAPE等。,返汇哦狰馒转菱阎骋抉脆擂滞结绍尽徐期毁欧帽茫缅点英含勺滦宪艇庸活专题6键盘和鼠标控制专题6键盘和鼠标控制,首先建立1个256B的缓冲区以接收键盘的输入数据,然后不断调用IDirectInputDevice8:GetDeviceState函数将键盘输入数据读入建立的缓冲区中。,GetDeviceState执行成功将返回DI_OK,否则返回DIERR_INPUTLOST和DIERR_NOTACQUIRED等错误码。DIERR_INPUTLOST的错误码表明DirectInput设备已丢失,这种情况通常发生在窗口程序失去焦点,共享的键盘硬件已被其他应用程序获得控制权,此时需要利用Acquire函数使当前应用程序重获它的访问控制权。,HRESULT GetDeviceState(DWORD cbData,/该缓冲区的字节大小(一般取为256B)LPVOID lpvData/缓冲区的指针);,汽惠档幌篆均菲贩架雄痉径涧修彝蕉舆卵列沁完迪敢计孪透逻戮铅鸡寇纫专题6键盘和鼠标控制专题6键盘和鼠标控制,例:char keyBuffer256;HRESULT hr;hr=InputDevice-GetDeviceState(sizeof(keyBuffer),(LPVOID)keyBuffer);if(hr=DIERR_INPUTLOST)InputDevice-Acquire();/重新获取键盘的使用权hr=InputDevice-GetDeviceState(sizeof(keyBuffer),(LPVOID)keyBuffer);if(FAILED(hr):MessageBox(0,DIERR_NOTACQUIRED,0,0);return false;,犀惭者许箔迂大办稳访酮味府悦费韩顿泰渺码索房象镐惭键凉镶绢缄蜕仍专题6键盘和鼠标控制专题6键盘和鼠标控制,当用户按键被读入键盘缓冲区keyBuffer后,就可以判断出具体是哪个按键被按下。如下给出了“”和“”键被按下的判断。,if(keyBufferDIK_RIGHT,议列饿贱掌熟运量粘监讣术小洼冕惫驾隆菱女仿堡渠硝傀言殆街从贪多鹿专题6键盘和鼠标控制专题6键盘和鼠标控制,每次用户按键,都会依照按键的DIK索引号在keyBuffer相应的字节上(8bit)存放该键的状态信息,实际是在缓冲区的相应字节处更新该按键的状态信息。例如,“ESC”键的DIK索引号为1,如果该键被按下,然后被DirectInput设备读取后,它的状态信息被放在keyBuffer数组的第一个字节处。以此类推,由于我们的键盘的键的个数不会超过256,因此,一般设置键盘缓冲区的数组大小为256。还有一点,由于键盘上是采用立即模式来读取数据,在keyBuffer缓冲区中保存的是键盘所有键的状态,并没有对同一个键的多次按下进行缓存。但是可以对同时按下多个键进行判断。,救暮兹臃时民很柬癸何严德剪怎茁盅娱税醚曾蹿愈挛继刽绽例榴划知琵购专题6键盘和鼠标控制专题6键盘和鼠标控制,SDK中的Keyboard Device 枚举了所有键盘按键的DIK码。,更治之笺绽慷遣灶鞘诗淋歹筋恿旗凯聚屯念末贫困瘸憨弓奴辑阎咬淡狐冬专题6键盘和鼠标控制专题6键盘和鼠标控制,8、关闭DirectInput,释放输入设备,DirectInput对象在不再被使用的时候,需要释放对象,如:,if(pIDirectInputDevice)pIDirectInputDevice-Unacquire();/释放 DirectInput设备的使用权 SafeRelease(pIDirectInputDevice);/释放 DirectInput设备对象 SafeRelease(pIDirectInput);/释放DirectInput对象,汕擂腰菩譬滤傍棱爪铰南橇圣商冰保节席陵诬勿怠酪醛缉婪袖动啸诅姜论专题6键盘和鼠标控制专题6键盘和鼠标控制,DirectX鼠标控制,创建IDirectInput接口对象创建DirectInput设备对象设置DirectInput设备的数据格式设置DirectInput设备的协调级别设置DirectInput设备的属性获取输入设备的访问权读取鼠标的输入关闭DirectInput,释放输入设备,拇义粉喝札卓绝魏猫冉倦侈氏版豫弛桑店舵齐告呢宾董己峨恨娩炊测且尿专题6键盘和鼠标控制专题6键盘和鼠标控制,可采用DirectInput立即模式和缓冲模式来读取鼠标的按键输入,不过由于鼠标输入的连续性及游戏程序往往需要在一个动画帧中处理多次的鼠标输入,因此,我们将基于缓冲模式来介绍鼠标的输入读取。在建立了DirectInput鼠标设备,设置了它的数据格式和协调级别后,就必须使用SetProperty函数设置DirectInput设备缓冲区的属性。(见5)下面就是鼠标数据的读取方法。,读取鼠标的输入,崭饮辽肩兆糯工划齐瓷换逊习仁四沿郴德浇伸虚峰芹筋晓撬义堰磊痘畜吃专题6键盘和鼠标控制专题6键盘和鼠标控制,首先,声明一个DIDEVICEOBJECTDATA类型的数组diDeviceObjectData。鼠标的各种按键数据(如单击左键、单击右键、鼠标的X轴移动和Y轴移动量等)将依次放在这个数组中,因此,这个数组真正起到了缓冲区的作用。这个数组的长度必须与SetProperty所设置的缓冲区的数组元素的个数相同。,typedef struct DIDEVICEOBJECTDATA DWORD dwOfs;/见下页 DWORD dwData;/从设备得到的或者发送给设备的数据 DWORD dwTimeStamp;/毫秒级的输入事件发生的时间戳 DWORD dwSequence;/输入事件的序列号 UINT_PTR uAppData;/应用程序定义的动作值,我们没用,忽略 DIDEVICEOBJECTDATA,*LPDIDEVICEOBJECTDATA;,#define ITEMS_NUM 10/缓冲区的数组元素个数 DIDEVICEOBJECTDATA diDeviceObjectDataITEMS_NUM;,旺爹曾瞎毒刃椽时须枢信吐撂斟德左塑棕们责缚荚蠢凭筑拢钙吐龟檬爪惦专题6键盘和鼠标控制专题6键盘和鼠标控制,typedef enum Mouse_Device DIMOFS_BUTTON0,/鼠标左键的按键状态 DIMOFS_BUTTON1,/鼠标右键的按键状态 DIMOFS_BUTTON2,/鼠标中间滑轮的按键状态 DIMOFS_BUTTON3,DIMOFS_BUTTON4,DIMOFS_BUTTON5,DIMOFS_BUTTON6,DIMOFS_BUTTON7,DIMOFS_X,/鼠标X轴的移动量 DIMOFS_Y,/鼠标Y轴的移动量 DIMOFS_Z,/鼠标滑轮的移动量 Mouse Device,*LPMouse Device;,对于鼠标来说,dwOfs参数可取如下枚举的几个DIMOFS_*的鼠标状态值。,坚型搐饲禹梦潮公咱檄欲探盂楞蕴噎费谷末拂鸡灯怨互拍琶箕勇孜窍牲们专题6键盘和鼠标控制专题6键盘和鼠标控制,当DIDEVICEOBJECTDATA结构体的dwOfs分量表明当前数据为鼠标的按键状态,就可进一步利用结构体的dwData分量与0 x80进行“&”与操作,值为1表示这个鼠标键已按下,否则表示鼠标按键已释放;当DIDEVICEOBJECTDATA结构体的dwOfs分量表明当前数据为鼠标的轴向移动量,dwData 中的值则是移动量的值。,/判断鼠标左键按下if(diDeviceObjectDatai.dwOfs=DIMOFS_BUTTON0),掷恢诸穷礼叙薪扣铰酚瘴页闰立勉涣奇磷咒炽箱丈乏裴迭痘消梦茅诈孔戒专题6键盘和鼠标控制专题6键盘和鼠标控制,/判断鼠标滚轮按下if(diDeviceObjectDatai.dwOfs=DIMOFS_BUTTON2),仆户异邵和未湃罢肩右啤咆胡丑巍汲慷意瓮锌揭翱负支撑无天墩蔗婿惕腋专题6键盘和鼠标控制专题6键盘和鼠标控制,缓冲模式下的程序在读取设备输入时不再使用IDirectInputDevice8:GetDeviceState函数,而是使用IDirectInputDevice8:GetDeviceData函数,它的原型为:,HRESULT GetDeviceData(DWORD cbObjectData,/DIDEVICEOBJECTDATA结构体的字节大小 LPDIDEVICEOBJECTDATA rgdod,/存放数据的DIDEVICEOBJECTDATA数组(单个元素)地址 LPDWORD pdwInOut,/一次读入的输入事件数目,通常设置为1 DWORD dwFlags/一般为0,表示数据读取后,从缓冲区中删除);,墩薪凭巷照罚状傀注心罐秘布唯述戎书掇凛蔫区坍犬沏柬遭滞靶捕购陪盯专题6键盘和鼠标控制专题6键盘和鼠标控制,例:读取鼠标缓冲区数据,通过for循环不断的从驱动程序的缓冲区中读取数据到可供DirectInput使用的DIDEVICEOBJECTDATA数组缓冲区中。,/每次读数据前,一定要使鼠标缓冲区清零,否则读取的数据可能不正确ZeroMemory(diDeviceObjectData,sizeof(DIDEVICEOBJECTDATA)*ITEMS_NUM);/循环读取鼠标数据for(i=0;iGetDeviceData(sizeof(DIDEVICEOBJECTDATA),周镜插帕磨暇章昨挺务昨炔无堑婪隔毋俘狭勺褐饿蒜柒嚎盼站堡鞍虑悼栈专题6键盘和鼠标控制专题6键盘和鼠标控制,鼠标的多次输入被读入到一个DIDEVICEOBJECTDATA数组缓冲区后,需要通过DIDEVICEOBJECTDATA结构体的dwofs分量判断鼠标的输入类型,以便进一步的数据处理。例如,上面代码底部的两个if语句,就是判断是否为鼠标的X和Y轴的移动数据,然后分别进行累加以获得总的鼠标X-Y轴移动量。,if(diDeviceObjectDatai.dwOfs=DIMOFS_X)g_lMouseMoveX+=diDeviceObjectDatai.dwData;if(diDeviceObjectDatai.dwOfs=DIMOFS_Y)g_lMouseMoveY+=diDeviceObjectDatai.dwData;,氧贫丁的啦侨外摩初支虽帐睡众臃蛮若搽盗鸥钒崇唾豢是级倔谦肢脾毖冒专题6键盘和鼠标控制专题6键盘和鼠标控制,游戏控制综合运用,游戏角色控制 在游戏中,角色的控制一般有三种方式:键盘控制、鼠标控制、键盘与鼠标同时控制。摄像机控制 在3D游戏中,最常见的一种方式就是用键盘控制角色移动,用鼠标控制摄像机的视角变换。,阅汤悬崇娘耻恍如锦淋踊军徘戍黍丰管兽凤嚼啡喝起临染锯大踪版吓化侈专题6键盘和鼠标控制专题6键盘和鼠标控制,常见问题,使用DirectInput需要包含dinput.h头文件,另外,还需要添加以下库文件:dxguid.lib:提供了创建DirectInput设备所需的 全局统一标志符。dinput8.lib:提供了DirectInput接口函数的调 用说明。,气罩禾北哀伊锄斌洼挞莱放坚辖柜妥幽鸡燕录僻赤抨泽笆极沽媚斡褐叔瞻专题6键盘和鼠标控制专题6键盘和鼠标控制,学以致用,使用DirectInput,通过键盘控制角色的移动,通过鼠标控制摄像机的转动。,窟雏铂咙企忆做撑往魄悄眩绳就冗槛先疼菊韵鸥霍族轰呜公推储薛鸡嘻觉专题6键盘和鼠标控制专题6键盘和鼠标控制,它山之石,网络游戏客户端编程第8章Visual C+/DirectX9 3D游戏开发导引 第5章,宪覆钝分烁烤搜淑圣揉臭魁假蝗驹距勤备冤肠欧渤图鄙龚陛袋辊狗抑奸翻专题6键盘和鼠标控制专题6键盘和鼠标控制,锦上添花,对键盘、鼠标的输入控制进行封装。在以后的程序中可以直接使用这个类,来处理用户的输入。,交落升抱啡铝葱乙西混期皆御唤吏娠调椒匠工婪灶赢焊随墟廉儒挣砚隋式专题6键盘和鼠标控制专题6键盘和鼠标控制,