第十二章:键盘与鼠标输入.doc
第十二章:键盘与鼠标输入
Introduction (序)
这一章我们将会创建一个简单的、可以被用户控制的地球模型。用户将可以通过鼠标来控制它的位置,通过键盘控制它的尺寸和旋转。
DirectInput
我们一直在用Direct3D来绘制3D对象,现在,我们想给程序增加一些与用户交互的功能,这得靠DirectInput。DirectInput允许我们从任何输入设备读取数据,鼠标、键盘或是游戏操纵杆,我们能用这些数据来改变场景中的元素。在此教程中,我们只会接触到键盘与鼠标,我们会在将来的教程中接触游戏操纵杆。
在我们的程序中,要增加与用户交互的功能我们需要完成以下步骤:
初始化DirectInput
设置键盘
设置鼠标
在每一帧,得到键盘与鼠标的当前状态并借以修改场景
程序结束时清理DirectInput
Include and Library files (头文件与库文件)
首先我们必须要做的,就是在项目中增加一些头文件与库文件,这很简单,不是吗?
dinput.h
dinput8.lib
dxguid.lib
The Controls (控制方案)
此章例子的控制方案如下:
上键:地球放大
下键:地球缩小
左键:增加地球的向左旋转
右键:增加地球的向右旋转
鼠标移动:改变地球的位置
鼠标左键:停止地球旋转
鼠标右键:默认的旋转方式
Initialising DirectInput (初始化DirectInput)
首先我们得初始化DirectInput,为此我们增加了一个新的函数InitialiseDirectInput,它会在CGame:: Initialise中被调用。下面这一小段代码用于创建DirectInput对象以待用:
//Create the DirectInput object
if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)m_pDirectInput, NULL)))
{
LogError(liUnable to create DirectInput interface.);
return false;
}
else
{
LogInfo(liDirectInput interface created OK);
}
第一个参数是我们从WinMain函数获得的应用程序实例句柄;第二个参数是DirectInput的版本,用DIRECTINPUT_VERSION代表当前的版本(输入其它版本导致Dinput模拟那个版本);第三个是想要的接口,我们这里就用IID_IDirectInput8;第四个是最重要的,它会返回DInput对象的接口指针已待用;第五个我们不用理它,输入NULL就对了。
m_pDirectInput是CGame的一个LPDIRECTINPUT8型的成员变量,当然是DInput对象的接口指针了。
Setting up the keyboard (设置键盘)
创建好DirectInput对象之后我们就可以设置键盘了。下面是设置键盘的代码,我会在后面逐渐地解释它们。
//KEYBOARD =======================================================================
//Create the keyboard device object
if(FAILED(m_pDirectInput-CreateDevice(GUID_SysKeyboard, m_pKeyboard, NULL)))
{
CleanUpDirectInput();
LogError(liUnable to create DirectInput keyboard device interface.);
return false;
}
else
{
LogInfo(liDirectInput keyboard device interface created OK.);
}
//Set the data format for the keyboard
if(FAILED(m_pKeyboard-SetDataFormat(c_dfDIKeyboard)))
{
CleanUpDirectInput();
LogError(liUnable to set the keyboard data format.);
return false;
}
else
{
LogInfo(liSet the keyboard data
原创力文档

文档评论(0)