没有合适的资源?快使用搜索试试~ 我知道了~
首页游戏开发组件深度解析:DirectInput与物理系统详解
游戏开发组件深度解析:DirectInput与物理系统详解
需积分: 10 2 下载量 3 浏览量
更新于2024-07-19
收藏 1.89MB PDF 举报
本资源是一份详尽的游戏开发组件教程,涵盖了多个关键领域的技术,旨在帮助开发者理解和应用到实际项目中。教程首先从游戏控制入手,介绍了DOS时代的控制方式,并深入剖析了Microsoft的DirectInput开发包。DirectInput部分详细讲解了其组成部分,如设备、全局唯一标识符(GUID)、协调层级,以及如何获取和管理设备,强调了它在游戏开发中的生命周期管理。 音乐与音效是游戏的重要组成部分,教程涉及了不同类型的音频文件(如WAV、MIDI、CD音频和MP3),并介绍了DirectX对音频文件的支持。DirectMusic接口编程让开发者了解音乐播放的高级功能,包括基本设计原则;DirectShow接口则用于处理流媒体文件和多媒体播放,而DirectSound则提供了更底层的声音处理,包括3D音效的实现。 3D音效部分解释了概念和技术细节,以及如何通过MCI来播放视频。教程还推荐了音频引擎FMOD,包括它支持的平台、许可制度、主要功能及优缺点,同时讨论了相关的术语和基本原理,以及如何进行FMOD的编程。 物理系统是教程的另一重点,涵盖了游戏内物理知识,如单位制、运动学模拟(粒子运动和刚体运动)、力学模拟(如重力和摩擦力)以及碰撞检测。这些内容对于模拟真实世界物理效果,提升游戏的真实感至关重要。 这份教程为游戏开发者提供了一个全面且实用的游戏开发工具箱,无论你是初次接触游戏开发,还是希望提升现有技能,都能从中受益匪浅。通过学习和实践这些组件,开发者可以构建出更加生动、交互性强的游戏体验。
资源详情
资源推荐
11
1.4 DirectInput 实现鼠标控制
鼠标数据的获取和键盘是类似的,只有在初始化、数据格式等环节有一些不
同。
步骤 1:创建 DirectInput 对象
步骤 2:创建设备对象
//创建鼠标设备
if(DI_OK!=m_pDInput->CreateDevice(GUID_SysMouse,&m_pDInputMouse,NULL))
MessageBox(hWnd,"创建鼠标设备失败!","ERROR",MB_ICONERROR|MB_OK);
步骤 3:设置数据格式
如果要使用自定义的数据格式 , 在 设 定 数 据 格 式 时 , 需 要 定 义
DIDATAFORMAT 指定自己的数据格式,当然,指定数据格式前,需要定义存储设
备数据的数据类型。即可以象使用标准键盘设备那样使用标准的鼠标:
m_pDInputMouse->SetDataFormat(&c_dfDIMouse) ;
//这里使用标准的 4 键鼠标
MouseState 结构体定义了一个鼠标的结构,数组 g_aObjectFormats[] 定义了
接收每个设备对象数据的方式,例如该数组的第一个元素表示将 ID 为 GUID_XAxis
的设备对象,也就是 X 轴的数据存放到自定义的 MouseState 结构中偏移量为
FIELD_OFFSET (MouseState, lAxisX)的位置,DIDFT_AXIS | DIDFT_ANYINSTANCE 指定
了设备类型和返回所有设备实例的数据。
struct MouseState //保存鼠标数据的结构
{ LONG lAxisX;
LONG lAxisY;
BYTE abButtons[3];
BYTE bPadding; // Structure must be DWORD multiple in size.
};
//定义鼠标数据的数组,描述了以上结构各个成员的功能
DIOBJECTDATAFORMAT g_aObjectFormats[] = { { &GUID_XAxis,
FIELD_OFFSET(MouseState, lAxisX), DIDFT_AXIS | DIDFT_ANYINSTANCE, 0 }, // X axis
{ &GUID_YAxis, FIELD_OFFSET(MouseState, lAxisY), DIDFT_AXIS |
DIDFT_ANYINSTANCE, 0 }, // Y axis
{ 0, FIELD_OFFSET(MouseState, abButtons[0]), DIDFT_BUTTON |
DIDFT_ANYINSTANCE, 0 }, // Button 0
{ 0, FIELD_OFFSET(MouseState, abButtons[1]), DIDFT_BUTTON |
DIDFT_ANYINSTANCE | DIDFT_OPTIONAL, 0 }, // Button 1 (optional)
{ 0, FIELD_OFFSET(MouseState, abButtons[2]), DIDFT_BUTTON |
DIDFT_ANYINSTANCE | DIDFT_OPTIONAL, 0 } // Button 2 (optional)
c_dfDIMouse 是这样定义的,定义鼠标格式时使用它:
DIDATAFORMAT g_dfMouse =
{ sizeof(DIDATAFORMAT),
sizeof(DIOBJECTDATAFORMAT),
12
DIDF_ABSAXIS,
sizeof(MouseState),
numMouseObjects,
g_aObjectFormats //描述信息
};
步骤 4:设置鼠标协调层级
步骤 5:取得鼠标控制权
步骤 6:读取鼠标数据
X、Y、Z 轴的数据:默认情况下,鼠标的移动量是相对位移,单位是硬件移
动的点数。和光标,屏幕分辨率没有关系。
鼠标本身是相对设备,它的移动并没有范围。
当使用相对模式时,立即数据返回的是自上次读取鼠标数据后到这次读取之
间发生的位移,缓冲数据返回的是上次写入缓冲区后鼠标的移动量;使用绝对移
动量时,返回的是鼠标自从获取后移动量的累计值。
坐标轴
+
-
X
右方
左方
Y
向上
向下
Z
滚轮背向玩家转动
向玩家转动
立即数据
用 IDirectInputDevice8::GetDeviceState 返 回 立 即 数 据 , 存 放 到
DIMOUSESTATE 或 DIMOUSESTATE2 结构体中(这两个结构体对应于 c_dfDIMouse
和
c_dfDIMouse2 );
缓冲数据
使用缓冲模式,需要设置缓冲区大小。这个和设置键盘数据缓冲区的方法是
一致的。缓冲区可以一次读完,也可以分步读取。
我们可以根据 DIDEVICEOBJECTDATA 的 dwOfs 成员判断是哪个设备对象的事
件,对于系统鼠标,dwOfs 的取值有以下几种:
DIMOFS_BUTTON0 到 DIMOFS_BUTTON7
DIMOFS_X
DIMOFS_Y
DIMOFS_Z
这个 dwOfs 表示改变状态的设备对象在 DIMOUSESTATE 中对应的成员的偏移
地址,它表示是哪个设备对象的事件。但是,数据并非保存于 DIMOUSESTATE 类
型的结构体中,而是以下结构体:
typedef struct DIDEVICEOBJECTDATA {
DWORD dwOfs;
DWORD dwData;
DWORD dwTimeStamp;
DWORD dwSequence;
UINT_PTR uAppData;
} DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;
13
dwData 相当于 lX,lY,lZ 或 rgbButtons[]中 dwOfs 指明的那一个。
dwOfs= DIMOFS_BUTTON0,表明缓冲数据是鼠标左键信息而 dwData 就是按键
0 的状态,相当于 rgbButtons[0] 。
dwOfs= DIMOFS_X,表明缓冲数据是鼠标左右移动的信息,而 dwData 就是移
动量,相当于 lX 。
立即模式与缓冲模式混合
那么用缓冲模式获取鼠标的移动信息是否合适呢?显然比较麻烦,还需要累
加每个移动事件的移动量,而使用立即模式比较合适,直接得到从上次读取到这
次之间发生的位移量。
但如何保证每个按键事件被获取呢?DirectInpu 允许同时使用缓冲模式
(GetDeviceData()函数)和立即模式(GetDeviceState()函数),我们在这里可以用缓冲
模式读取按键事件而用立即模式读取鼠标位移量。
步骤 7:释放资源
剩余63页未读,继续阅读
anddyhzw
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功