欢迎来到天天文库
浏览记录
ID:47433693
大小:276.50 KB
页数:42页
时间:2020-01-11
《vc++游戏编程指南》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第八章支撑游戏的基石29第七章我没有想好名字如果你只靠上面几章所讲述的知识编了个游戏,喜欢的人恐怕会不多J,为什么?因为没有人会玩一个控制不流畅而且声音效果不佳的游戏。为了在游戏中更好地管理各种输入设备,我们需要使用DirectInput。而通过使用DirectXAudio可以在游戏中实现各种更逼真的音乐效果。它们都是DirectX的重要组成部分。使用DirectInput前我们需要#include并在工程中加入dinput8.lib和dxguid.lib,而使用DirectXAudio前我们需要#include并在工
2、程中加入dsound.lib和dxguid.lib。7.1读取键盘数据首先,我们必须创建一个DirectInput8对象(DirectX9.0并没有对DInput和DAudio做多大改动),就像这样:LPDIRECTINPUT8pInput;DirectInput8Create(GetModuleHandle(NULL),DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&pInput,NULL);然后,我们需要创建一个DirectInput设备:LPDIRECTINPUTDEVICE8pDev;pInput->Cre
3、ateDevice(GUID_SysKeyboard,&pDev,NULL);设置好它的数据格式:pDev->SetDataFormat(&c_dfDIKeyboard);设置它的协作级,这里设为独占设备+前台:pDev->SetCooperativeLevel(hwnd,DISCL_EXCLUSIVE
4、DISCL_FOREGROUND);获取设备:pDev->Acquire();像上面那样初始化后,我们就已经把Windows对键盘的控制权剥夺了,以后的键盘消息将不会被送入消息循环,我们可以把消息循环中处理键盘消息的语句拿掉了。当然,这时我们需要在程序的适当地
5、方,比如说在刷新游戏时,加入对键盘数据进行读取和处理的语句,就像下面的一段程序:第八章支撑游戏的基石29#defineKEYDOWN(key)(buffer[key]&0x80)//定义一个宏,方便处理键盘数据charbuffer[256];//键盘数据pDev->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);//得到键盘数据if(KEYDOWN(DIK_XXX))//如果XXX键被按下…(请参阅附录二){……//处理之}……//处理其它键哈哈,真是挺方便的。有时候真的有点怀疑DirectX是不是一种回到遥远的可
6、爱的DOS时代的“倒退”。因为无论是DirectInput还是DirectDraw都是太像DOS下的做法了。7.2读取鼠标数据读取鼠标数据和读取键盘数据的步骤差不多,首先也是要创建设备:pInput->CreateDevice(GUID_SysMouse,&pDev,NULL);设置数据格式:pDev->SetDataFormat(&c_dfDIMouse);设置协作级:pDev->SetCooperativeLevel(hwnd,DISCL_EXCLUSIVE
7、DISCL_FOREGROUND);获取设备:pDev->Acquire();那么怎样读取鼠标数据
8、呢?如果要取得鼠标的当前状态,这样即可:DIMOUSESTATEmouse_stat;//鼠标状态//得到鼠标状态pDev->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mouse_stat);得到的mouse_stat是一个DIMOUSESTATE类型的结构,它有四个成员:lX,lY,lZ和rgbButtons[4]。其中lX、lY和lZ分别是自上次调用此函数以来鼠标在X轴、Y轴和Z轴(滚轮)方向上移动的距离,而不是鼠标此时的坐标;其距离单位不是像素,但你完全可以把它看做以像素为单位。所以,我们需要定义两个变量m
9、ousex=0和mousey=0,然后把lX和lY累加上去即可。这样做的好处是鼠标坐标不再受屏幕的制约,而且屏幕中心的mousex和mousey值可以永远是0,不随屏幕分辨率而改变。rgbButtons是一个存储哪些鼠标键被按下的数组,我们可以这样做来读取它://定义一个宏,方便处理鼠标数据第八章支撑游戏的基石29#defineMOUSEBUTTONDOWN(b)(mouse_stat.rgbButtons[b]&0x80)if(MOUSEBUTTONDOWN(0))//如果左键被按下…{……//处理之}……//处理右键(1)和中键(2)7.3恢复和关闭Dir
10、ectInput7.3.1恢复Dire
此文档下载收益归作者所有