创作背景:近期,一友人希望使用手柄代替键盘玩格斗游戏,自行写了款手柄键盘模拟器,结果在游戏时无法正常运行,托在下看看。程序写得不错,手柄很准确地在记事本上输出键盘键码。

然而,进入游戏,却什么反应都没有。一个念头闪现出来,游戏的输入是通过directinput实现的,比WINDOWS API 更接近底层,这样可以赢取更短的响应时间,程序需向directinput改进,然而这里不得不说下:上网搜索大小网站都是那篇API 实现手柄信息获取的文章,和友人的代码90%的相似度,文章写得很好说真的,但全是这篇就有点过了。国内没有要找的就找下国外吧,百度的确有些害人,因为太懂中文,国外的directinput一张都没有,立马换了搜索页,2小时就用directinput完成了手柄信息获取,然而殊不知接下来的震动功能花费了4天时间…

完成后界面:

功能目标: 1、获取手柄方向、按键信息;2、使手柄震动

注意,本程序只是通过DX发送震动信息,并不是什么万能手柄驱动啊。

测试手柄震动前,请确认使用的是震动手柄并安装了手柄驱动。

开发环境:Win7 (DX10传说中的DX11类库我没有找到,结果项目建了.NET 3.5)

Microsoft Visual Studio 2010

数据库无

代码在1920 X 1080 分辨率下无过长换行

编写人数 1人

参考资料:MSDN资料库

言归正传,在.NET的高封装的环境下,directinput的使用简化了许多,不了解COM的朋友,甚至是不知道句柄、指针的新手也可以轻易掌握。

思路与实现:首先,我们要计算机找到我们的摇杆设备

foreach (DeviceInstance info in Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly))
{
Device myJoy = new Device(info.InstanceGuid);
}

然后控制设备,过去用c++的朋友很熟悉了,申请操作级别,这个真的很重要,在最后测试震动报了“没有独占打开无法操作”的异常,单步了整整一天,才发现是这里设错参了。

myJoy.SetCooperativeLevel(null, CooperativeLevelFlags.Background | CooperativeLevelFlags.Exclusive);

再设置其他参数

myJoy.Properties.AxisModeAbsolute = true;
myJoy.Properties.AutoCenter = false;
myJoy.Acquire();
int[] axis = null;
foreach (DeviceObjectInstance doi in myJoy.Objects)
{
if ((doi.ObjectId & (int)DeviceObjectTypeFlags.Axis) != 0)
{
myJoy.Properties.SetRange(ParameterHow.ById, doi.ObjectId, new InputRange(-128, 128));
}
}

好了,目标1完成,很快是不?手柄的状态已经在myJoy. CurrentJoystickState下了,通过

myJoy. CurrentJoystickState. ToString() 你可以查看到摇杆状态(微软大费苦心啊,左摇杆、右摇杆、光枪,压杆,基本上能想到的有位移的操作杆都有了)

allJoystick.Joysticks[i].CurrentJoystickState.GetButtons()可以得到按下按钮组合的数组

好,开始进军震动了。震动不同于按键捕捉、不同于模拟键盘、鼠标击键,因为这些计算机都是作为信息的接受方,然而这次是手柄作为接受方。也与一些挂起、响应的程序不同,挂起的程序用于监听端口,当有数据流后运算后反馈硬件。

例如,我进入一款格斗游戏后不对手柄进行任何输入,时间到后自动选人开打,在被CPU攻击时手柄是有震感的。

也就是说震动指令是由计算机发起的,当时还真想用汇编给它来一段,装了个Bus Hound 5.0 抓包结果Win7蓝屏 花了1个多小时恢复。

扯远了,手柄的震动是像声音一样播放的,看参考资料,资料中例举了使用SDK下的录制好的震动文件来驱动,国外一达人说该函数有BUG,刚好我又不想下载几百兆的SDK。故选择了最后一种方式,现场定制(录制)、现场播放。

代码不难,调试却很罗嗦。

//震动类型
public enum ForceType
{
VeryBriefJolt,
BriefJolt,
LowRumble,
HardRumble
}
//录制函数,照抄参考资料
public static EffectObject InitializeForce(Device Dev, EffectType Type, int[] Axis, int Magnitude, EffectFlags Flags, int Duration)
{
EffectObject eo = null;
Effect e;
foreach (EffectInformation ei in Dev.GetEffects(EffectType.All))
{
if (DInputHelper.GetTypeCode(ei.EffectType) == (int)Type)
{
e = new Effect();
e.SetDirection(new int[Axis.Length]);
e.SetAxes(new int[1]);
e.EffectType = Type;
e.ConditionStruct = new Condition[Axis.Length];
e.Duration = Duration;
e.Gain = 10000;
e.Constant = new ConstantForce();
e.Constant.Magnitude = Magnitude;
e.SamplePeriod = 0;
e.TriggerButton = (int)Microsoft.DirectX.DirectInput.Button.NoTrigger;
e.TriggerRepeatInterval = (int)DI.Infinite;
e.Flags = Flags;
e.UsesEnvelope = false;
eo = new EffectObject(ei.EffectGuid, e, Dev);
}
}
return eo;
}
//播放
InitializeForce(myJoy, EffectType.ConstantForce, axis, 10000, EffectFlags.ObjectOffsets | EffectFlags.Spherical, 2000000).start(1);

用震动来按摩还真不错,附上调试好的源码,与各位同僚共勉:

源码下载

C# 通过DirectInput 实现手柄操控相关推荐

  1. 根据手柄操控仿真机器人

    环境 与 准备 Ubuntu 16.04(博主的是VM虚拟机) kinetic版本的ROS平台 手柄(博主的是索尼的PS4手柄) 能把这篇博客上的东西实现 仿真机器人的准备 一.连接手柄 如果你使用的 ...

  2. 手柄映射键盘_如何使用运动加加TAP手柄在PC上玩手游

    运动加加TAP手柄,不仅仅是一款体感手柄,同时也是一款多功能的通用游戏手柄,支持智能电视.电视盒子,手机.PC等各种平台. 运动加加TAP手柄可以一键切换为标准游戏手柄,在标准游戏手柄模式下,左手触摸 ...

  3. vc读取北通手柄按键_原神北通宙斯手柄按键功能介绍

    原神手柄按键有哪些?pc版已经正式公测,很多玩家玩家比较喜欢手柄操控游戏,小编这里给大家带来了原神北通宙斯手柄按键功能介绍,一起来看下吧. 原神北通宙斯手柄按键功能介绍 游戏介绍 原神是由米哈游自研的 ...

  4. 华为鸿蒙支持手柄,华为智慧屏S系列正式发布 率先搭载最新版鸿蒙OS

    原标题:华为智慧屏S系列正式发布 率先搭载最新版鸿蒙OS 12月21日,华为智慧屏S系列正式发布,分为55/65/75三个尺寸以及普通版/Pro版两种规格,售价从3299元至7299元不等. 12月2 ...

  5. 电视游戏会是未来客厅娱乐的主角吗?

    在时下流行的多屏生态概念中,电视虽为最大屏幕,但与智能手机.平板等小屏相比,属于相对较弱的一环.无移动性.自身交互性不足,在一定程度上影响着它在移动时代的发展.而作为最能体现其"吸睛能力&q ...

  6. 特斯拉化身电影院,马斯克:车自动开,你来看电影

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 关于特斯拉,马斯克又有新设想: 一个私人移动电影院. "钢铁侠"发布Twitter表示,当完全自动驾驶通过监管批准后, ...

  7. (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计

    在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...

  8. 软硬整合:开发一款VR大作背后的技术支撑

    最近两年,虚拟现实(VR)从初入公众视野到逐渐变得炙手可热,很大程度上是来源于其所带来的生动逼真.极具冲击的沉浸式感官体验.不过,当许多来自不同领域的开发者想进入虚拟现实领域一试身手,却遭遇了「道路阻 ...

  9. 小鸡G4工程款 上手体验

    前言:之前只是抱着试一试的态度在小鸡活动贴下报名,说实话之前并没有抱希望能够没选中.所以非常感谢小鸡团队给我的这次机会.这应该是我第一次参与厂家的内测活动.希望能给小鸡团队,给广大玩家带来一片实用的上 ...

  10. 米兔机器人终于拼完了_找回童年的DIY乐趣 米兔积木机器人拼装体验

    找回童年的DIY乐趣 米兔积木机器人拼装体验 2017年10月13日 15:57作者:马景东编辑:马景东文章出处:泡泡网原创 分享 米兔积木机器人是小米发布的首款智能机器人玩具,这次有机会获得体验机会 ...

最新文章

  1. Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color)
  2. SAP MM 物料库存转固定资产,报错:You cannot post to asset in company code 1900 fiscal year 2021
  3. asp.net C# 将数据导出到Execl汇总
  4. asp.net mvc5编程实战_深圳荷坳车铣复合编程培训cnc数控编程技术
  5. HTML与CSS基础之常用选择器(一)
  6. Qt中的TableWidget初始化表头、行高、选中、自动扩展和接受修改
  7. poj2431java_POJ 2431 Expedition
  8. javascript 数组过滤重复对象
  9. html 网络请求 json数据,写一个json格式API,http请求接收json数据
  10. Oracle与Google两IT巨头战争冲击整个硅谷
  11. quartz定时任务cron表达式详解
  12. C1能力认证考试训练任务01-进制与信息编码
  13. 如何理解开仓与平仓规则?
  14. python面板数据模型操作步骤_面板数据分析方法步骤全解
  15. pb+api实际应用
  16. JavaScript获取当前时区 时间转换
  17. ubuntu删除桌面快捷程序
  18. quot;多看nbsp;fornbsp;kindle3”升级包下载
  19. 迪斯尼乐拍通照片抓取
  20. 适配器模式实战场景和本质

热门文章

  1. 2021-07-31
  2. ffmpeg 简单教程
  3. 详细解决tomcat乱码 IDEA控制台乱码
  4. 用链表写的一个通讯录
  5. 数据结构-天勤习题1
  6. 51单片机循迹小车工作原理与程序设计思路
  7. 基于Unity的阿里云短信SDK接入流程
  8. 江苏大学数字图像处理MATLAB人脸识别,MATLAB人脸识别代码
  9. InfoPath基础应用教程-2 表单中的规则(1)
  10. 微型计算机控制技术第三版第四章课后答案,微型计算机控制技术第4章习题答案.doc...