C# 通过DirectInput 实现手柄操控
创作背景:近期,一友人希望使用手柄代替键盘玩格斗游戏,自行写了款手柄键盘模拟器,结果在游戏时无法正常运行,托在下看看。程序写得不错,手柄很准确地在记事本上输出键盘键码。
然而,进入游戏,却什么反应都没有。一个念头闪现出来,游戏的输入是通过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 实现手柄操控相关推荐
- 根据手柄操控仿真机器人
环境 与 准备 Ubuntu 16.04(博主的是VM虚拟机) kinetic版本的ROS平台 手柄(博主的是索尼的PS4手柄) 能把这篇博客上的东西实现 仿真机器人的准备 一.连接手柄 如果你使用的 ...
- 手柄映射键盘_如何使用运动加加TAP手柄在PC上玩手游
运动加加TAP手柄,不仅仅是一款体感手柄,同时也是一款多功能的通用游戏手柄,支持智能电视.电视盒子,手机.PC等各种平台. 运动加加TAP手柄可以一键切换为标准游戏手柄,在标准游戏手柄模式下,左手触摸 ...
- vc读取北通手柄按键_原神北通宙斯手柄按键功能介绍
原神手柄按键有哪些?pc版已经正式公测,很多玩家玩家比较喜欢手柄操控游戏,小编这里给大家带来了原神北通宙斯手柄按键功能介绍,一起来看下吧. 原神北通宙斯手柄按键功能介绍 游戏介绍 原神是由米哈游自研的 ...
- 华为鸿蒙支持手柄,华为智慧屏S系列正式发布 率先搭载最新版鸿蒙OS
原标题:华为智慧屏S系列正式发布 率先搭载最新版鸿蒙OS 12月21日,华为智慧屏S系列正式发布,分为55/65/75三个尺寸以及普通版/Pro版两种规格,售价从3299元至7299元不等. 12月2 ...
- 电视游戏会是未来客厅娱乐的主角吗?
在时下流行的多屏生态概念中,电视虽为最大屏幕,但与智能手机.平板等小屏相比,属于相对较弱的一环.无移动性.自身交互性不足,在一定程度上影响着它在移动时代的发展.而作为最能体现其"吸睛能力&q ...
- 特斯拉化身电影院,马斯克:车自动开,你来看电影
乾明 发自 凹非寺 量子位 报道 | 公众号 QbitAI 关于特斯拉,马斯克又有新设想: 一个私人移动电影院. "钢铁侠"发布Twitter表示,当完全自动驾驶通过监管批准后, ...
- (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...
- 软硬整合:开发一款VR大作背后的技术支撑
最近两年,虚拟现实(VR)从初入公众视野到逐渐变得炙手可热,很大程度上是来源于其所带来的生动逼真.极具冲击的沉浸式感官体验.不过,当许多来自不同领域的开发者想进入虚拟现实领域一试身手,却遭遇了「道路阻 ...
- 小鸡G4工程款 上手体验
前言:之前只是抱着试一试的态度在小鸡活动贴下报名,说实话之前并没有抱希望能够没选中.所以非常感谢小鸡团队给我的这次机会.这应该是我第一次参与厂家的内测活动.希望能给小鸡团队,给广大玩家带来一片实用的上 ...
- 米兔机器人终于拼完了_找回童年的DIY乐趣 米兔积木机器人拼装体验
找回童年的DIY乐趣 米兔积木机器人拼装体验 2017年10月13日 15:57作者:马景东编辑:马景东文章出处:泡泡网原创 分享 米兔积木机器人是小米发布的首款智能机器人玩具,这次有机会获得体验机会 ...
最新文章
- Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color)
- SAP MM 物料库存转固定资产,报错:You cannot post to asset in company code 1900 fiscal year 2021
- asp.net C# 将数据导出到Execl汇总
- asp.net mvc5编程实战_深圳荷坳车铣复合编程培训cnc数控编程技术
- HTML与CSS基础之常用选择器(一)
- Qt中的TableWidget初始化表头、行高、选中、自动扩展和接受修改
- poj2431java_POJ 2431 Expedition
- javascript 数组过滤重复对象
- html 网络请求 json数据,写一个json格式API,http请求接收json数据
- Oracle与Google两IT巨头战争冲击整个硅谷
- quartz定时任务cron表达式详解
- C1能力认证考试训练任务01-进制与信息编码
- 如何理解开仓与平仓规则?
- python面板数据模型操作步骤_面板数据分析方法步骤全解
- pb+api实际应用
- JavaScript获取当前时区 时间转换
- ubuntu删除桌面快捷程序
- quot;多看nbsp;fornbsp;kindle3”升级包下载
- 迪斯尼乐拍通照片抓取
- 适配器模式实战场景和本质