DirectInput编程基础

2024-02-12 11:40
文章标签 基础 编程 directinput

本文主要是介绍DirectInput编程基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

导读:
  DirectInput编程基础 - 简介 出 处: 中国游戏开发者
  [ 2001-09-09] 作 者
  目 录
  1.1 DirectInput概念
  1.2 设置DirectInput
  1.3 列举设备
  1.4 设置设备
  1.5 取得输入数据
  绪言
  输入相对于图形和声音而言从未成为游戏开发中的非常重要的论题。读取键盘按键、鼠标移动和游戏杆位置似乎并没有什么困难,但随着新输入设备对市场的强烈冲击以及DirectX的发行,这一问题变得日益重要了。
  如果用户是DirectInput编程的新手,那么应先排除掉一些旧观念。应记住的重要一点是DirectInput的得名是因为它直接与设备驱动器通讯,对鼠标和键盘也就意味着立即响应硬件中断,而不是等待Windows发送消息证明已发生输入事件。当然,DirectInput放弃了Windows的消息队列,在虚构WM_KEYDOWN或WM_MOVSEMOVE等消息的同时也就不再享受Windows提供的一些服务。这种服务大都不是对游戏输入特别有用,但它有助于理解缺少这些服务时所产生输入信息的含义,后面有关鼠标和键盘输入的章节中,将深入地讨论这一问题。
  当然,DirectInput放弃了Windows的消息队列,在虚构WM_KEYDOWN及WM_MOVSEMOVE等消息的同时也就不再享受Windows提供的一些服务。这种服务大都不是对游戏输入特别有用,但它有助于理解缺少这些服务时所产生输入信息的含义,后面有关鼠标和键盘输入的章节中,将深入地讨论这一问题。
  1.1、DirectInput概念
  下面看一下DirectInput所关心的内容:输入设备及其部件。
  1.1.1 设备
  DirectInput可识别三种基本设备类型:
  键盘,标准系统键盘。
  鼠标,这一类中包括所有类似于鼠标的设备,如触摸板、跟踪球以及相应的按键。
  游戏杆,相对于其它类型的控制器和力反馈设备而言,这是易于产生误解的名称,其范围从简单的游戏杆直至虚拟现实的复杂设备。本书中,我们使用这一名称是为了与DirectInput术语保持一致,但应记住,当谈到“游戏杆”时,这一说法一般是“特殊游戏控制器”的简称。  只要讲到DirectInput,那么设备就是指由设备驱动器代表的螺丝、螺母集合, 带有内置跟踪球或触摸板的膝上键盘算作两个设备,但带有力反馈激励器的游戏杆却是一个设备。DirectInput API和文档中把返回数据或产生力反馈效果的设备的不同部分都称为设备对象实例或简称对象,这两种叫法都不是最佳的。因为“对象”一词(在其它情况下)指代码对象,“实例”批COM接口的例示。在本文中,我们尽量避免使用这种叫法,而用更准确的“设备物”取代。我们认为,设备物可以是任何的键、按钮、视点帽或轴等。
  另一个更易混淆的问题是“设备”可以指物理对象(如其驱动器)也可以指DirectInput创建的DirectInputDevice对象。当讲到创建一个设备时,我们指获得一个指向IDirectInputDevice接口的指针,以便可以用相应方法与设备驱动器通讯。
  1.1.2 按钮和轴
  按钮是任何具有开和关状态的设备。DirectInput在概念上不对按钮加以区分,它们可以位于鼠标上、游戏杆上或游戏板上,还可以是键盘上的键。
  轴是设备中的一种控制而不是按钮 — 有位置而不是开、关状态的事物。严格地说,轴不是物理对象,而是由物理对象向某一方向的移动产生的一个值。游戏杆、跟踪球、鼠标球和触摸板等一个物理对象控制两个轴的值,分别称为X轴和Y轴,因为它们一般控制的是二维计算机屏幕上的指针或游戏元素。游戏杆上的减速把手或滑块只控制一个轴,它与MicrosoftIntelliMouse鼠标中的转轮是一样的。游戏杆上也可能有其它的轴,如用于控制舵方向的扭转动作等,用于驾驶、飞行摸拟等的特殊控制器依靠操纵轮、轭、踏板等操纵多个轴。
  视点帽是例外的一种情况,它不是有任何按钮或轴,后面有关游戏杆的章节中将详细讨论这一设备。应记住的重要一点是,轴与物理空间或其它事件之间不存在固定关系。
  程序上下文中设备的Z轴(尽管与三维坐标系统中一个轴的名称相同)可能与空间的第三维毫无关系,而其作用却可能是控制翻页、音量或其它非空间属性。虽然已有一些成形的约定,如把X 轴与控制器的左右运动和屏幕上的水平方向相关联,但映射设备中的物理量与DirectInput中逻辑轴的关系是由设备驱动器实现的,而把这些轴与它们发挥作用的游戏概念关联起来是由程序设计者完成的 — 或给使用者以选择的机会并由他们完成。
  轴可以是绝对的或相对的。游戏杆中的X轴和Y轴天生是绝对的,因为在任何方向它们都只能移动有限的距离,他们的位置也通常是以与某一固定中心点的距离而测量的。相反,鼠标天生是一种相对的设备,因为它可以在任何方向上无限地移动,而且也设有“原点”,对它所关心的只是在上一次检测之后它沿每个轴运行的距离。
  DirectInput可以违反天性而把任何轴当作绝对的或相对的来处理。但多数情况下把鼠标(包括转轮)处理为绝对的轴,把其它设备 — 杆、滑块、拨号盘当作相对轴处理,也就是说,对鼠标要考虑的是其运动,而其它轴考虑的则是位置。
  1.2、设置DirectInput
  简单地调用DirectInputCreate函数(见表1-1)就可以初始化DirectInput系统,此函数将返回一个指向IDirectInput接口的指针,然后可以用此接口的方法列举设备并创建设备对象,这些设备对象是DirectInput的工作部分。
  表1-1 DirectInputCreate函数
  HRESULT WINAPI DirectInputCreate(
  HINSTANCE hinst,
  DWORD dwVersion,
  LPDIRECTINPUT * lplpDirectInput,
  LPUNKNOWN punkOuter
  );
  参数 说明
  HINSTANCE hinst 创建DirectInput对象的程序或DLL的实例句柄
  DWORD dwVersin 设计程序所用的DirectInput版本号,此值通常为DIRECTINPUT_VERSION,但看到的是文本
  LPDIRECTINPUT *lplpDirectInput 新DirectInput对象的指针地址
  LPUNKNOWN pUnkOuter 必须为NULL
  注意:DirectX非常灵活地允许用户用以前的版本(实际即为版本3)进行设计,只要给DirectInputCreate函数传递一个非DIRECTINPUT_VERSION值就行了。如果传递的是OXO300,则程序在装有DirectX 3运行文件的系统中会很好地运行。但必须确保在所用结构与DirectX与定义的不同时,使用与DirectX3兼容的结构,如DIDEVCAPS_DX3。
  简单有效的方法是在包含DINPUT.H文件前给出自己对DIRECTINPUT_VERSION的定义,如:现在不用担心使用旧结构了,因为DINPUT.H被解释过以后,所存的新结构都奇迹般地转换成对应的早期结构,其中DIDEVCAPS与DIDEVCAPS_DX3一致,如此类推。
  提示:即使是用新版DirectInput进行设计,也可以使用旧版本中的结构,用途之一是IDirectInputDevice:: GetCapabilities方法,通过传递传来DIDEVCAPS_DX3结构将省去DirectInput查询力反馈驱动器的一步,可使速度略有提高。当然只有在对力反馈不感兴趣时才可这样做,同时不要忘记初始化dwSize成员为sizeof(DIDEVCAPS_DX3)。
  1.3、列举设备
  你一般不需要列举鼠标和键盘。即使与用户系统连接的这两种设备都不止一个(当然这种可能很小),我们也可以通过在IDirectInput::CreateDevice中使用预定义的变量GUID_SYSMOUSE 和GUID_SYSKEYBOARD来解决。
  游戏杆则属于另一种情况,因为不存在所谓的“系统游戏杆”。一些用户会安装多种游戏控制器的驱动程序,甚至把多个这种设备连接到系统。至少,为了获得了一个合适的设备或多个设备的GUID,要对其进行列举,或许为了使用户能进行选择还需要列举所有可用的设备。后面有关游戏杆的章节中将详细讨论这一问题。
  要列举设备需要先建立一个回调函数,然后调用EnumDevices方法,见表1-2。
  表1-2 EnumDevices方法
  HRESULT IDirectInput::EnumDevices(
  DWORD dwDevType,
  LPDIENUMCALLBACK lpCallback,
  LPVOID pvRef,
  DWORD dwFlags
  );
  参数 说明
  DWORD dwDevType DIDEVTYPE_* 值,指定要查找的设备类型,如为0则查找所有类型
  LPDIENUMCALLBACK lpCallback 回调函数地址
  LPVOID pvRef 可为任何值,典型值为一指向数据的指针,可在回调函数中使用或修改。这是传给回调函数的第二个参数
  DWORD dwFlags 对列举的更严格的限制标志。可以为(a)DIEDFL_ALLDEVICES(=0)或(b)DIEDFL_ATTACHEDONLY和DIEDFL_FORCEFEEDBACK之一或两者皆有
  EnumDevices用到的回调函数可以有许多用途。被列举的特定设备的许多信息都在DIDVICEINSTANCE结构中,此结构由DirectInput自动建立并传给回调函数,下面是回调函数如何使用这些信息的几个例子:
  1)创建此设备。此设备的实例GUID已位于DIDEVICEINSTANCE结构中,因此回调函数可以很方便地获取IDirectInputDevice接口并进行其它初始化工作。
  2)检查设备的子类型,例如,可以检查键盘子类型并对游戏功能对应的键做必

这篇关于DirectInput编程基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702517

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close