三自由度的动感座椅可以让玩游戏人员在玩的过程中随座椅一起晃动,通过应用程序对方向盘动作的抓取来实现体感,动作类型主要分为加速(后仰,对应踩油门)、减速(前倾,对应踩刹车 )、左转(向左打方向盘)、右转(向右打方向盘)。座椅通过3个电缸支撑起来,程序初始化之后,会让三个电缸依据自己的行程运动到中间位置,动作类型的角度依据机械结构来进行自定义。以上是针对整体项目的一个简单介绍,接下来想说明一下如何通过代码的方式来实现对游戏方向盘的数据抓取。常规的思路有2种:1种是通过DirectInput技术,一种是通过Win API(Multimedia joystick API),今天这里讲解如何通过前者来实现针对游戏方向盘数据的抓取。
 
 
抓取方向盘数据主要通过Joystick类来实现,下面是该类的核心函数runJoystick,代码如下:
INT_PTR Joystick::runJoystick( HWND hDlg)
{ switch( this->msg )
{
case WM_INITDIALOG:
InitDirectInput( hDlg );
return TRUE; case WM_TIMER:
// Update the input device
UpdateInputState( hDlg);
return TRUE; case WM_DESTROY:
// Cleanup everything
FreeDirectInput();
return TRUE;
} return FALSE; // Message not handled
}

定时器中的UpdateInputState函数在设定的循环周期内将游戏方向盘中的数据抓取出来,代码如下:

HRESULT Joystick::UpdateInputState( HWND hDlg)
{
HRESULT hr;
TCHAR strText[] = {}; // Device state text
DIJOYSTATE2 js; // DInput Joystick state if( NULL == this->g_pJoystick )
return S_OK; // Poll the device to read the current state
hr = this->g_pJoystick->Poll();
if( FAILED( hr ) )
{
// DInput is telling us that the input stream has been
// interrupted. We aren't tracking any state between polls, so
// we don't have any special reset that needs to be done. We
// just re-acquire and try again.
hr = this->g_pJoystick->Acquire();
if( hr == DIERR_INPUTLOST )
{
this->g_pJoystick->Acquire();
return hr;
}
// hr may be DIERR_OTHERAPPHASPRIO or other errors. This
// may occur when the app is minimized or in the process of
// switching, so just try again later
return S_OK;
} // Get the input's device state
if( FAILED( hr = this->g_pJoystick->GetDeviceState( sizeof( DIJOYSTATE2 ), &js ) ) )
{
this->errorMSG = "Joystick connection lost";
this->msg = WM_DESTROY; //find a new joystick
return hr;
}
//Read values into Joystick object
this->setAxis(js.lX, js.lY, js.lZ, js.lRx, js.lRy, js.lRz, js.rglSlider[], js.rglSlider[]); this->setPOV(js.rgdwPOV[], js.rgdwPOV[], js.rgdwPOV[], js.rgdwPOV[]); for( int i = ; i < ; i++ )
{
if( js.rgbButtons[i] & 0x80 )
this->setButton(i,true);
else
this->setButton(i,false);
} this->errorMSG = "Reading Joystick OK";
return S_OK;
}

相关程序的Demo下载地址在这里

如何通过DirectInput技术针对莱仕达雷驰V3II游戏方向盘编程的更多相关文章

  1. 如何通过XInput技术针对游戏方向盘或者手柄编程

    目前市面上的游戏外设,要么支持传统的DirectInput接口,要么支持最新的XInput技术.今天在这里聊一聊,如何通过XInput技术实现对这类游戏外设相关信息的捕获.关于DirectInput与 ...

  2. socket技术详解(看清socket编程)

    socket编程是网络常用的编程,我们通过在网络中创建socket关键字来实现网络间的通信,通过收集大量的资料,通过这一章节,充分的了解socket编程,文章用引用了大量大神的分析,加上自己的理解,做 ...

  3. 聚焦小游戏技术生态,腾讯游戏云GAME-TECH落地厦门

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 2018迎来了小游戏元年,据<2018年小游戏行业白皮书>显示:2018年小游戏市场规模预 ...

  4. 利用Docker技术实现UDP广播效果(网络编程python版)

    docker的安装见官方文档 我使用的系统为Ubuntu16.04 Ubuntu系统安装docker文档地址:https://docs.docker.com/engine/installation/l ...

  5. JELLY技术周刊 Vol.15 云游戏会是 5G 杀手级应用么?

    蒲公英 · JELLY技术周刊 Vol.15 听到"云游戏",或许我们的第一反应会是"云玩家"而不是那些上云的"游戏",在这个 5G 已来的 ...

  6. 屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

    游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToW ...

  7. 【技术累积】【点】【编程】【13】XX式编程

    (原)函数式编程 核心概念 函数式一等公民(输入输出啥的都可以是函数): 纯函数,固定输入带来固定输出: 阅读性良好,无并发问题,但效率偏低: 大历史背景 旨在描述问题如何计算: 有两位巨擘对问题的可 ...

  8. 针对某p社游戏某整合包的研究

    软件分析 垃圾re手 最近在玩群星 创意工坊里面下载了整合包 进群下载排序文件后竟然发现要付费() 28R够吃一顿好的 马上来分析一下这个软件 这是一个四版整合包的mod安装器 其中樱花远征和新星纪元 ...

  9. Java都有什么进阶技术

    Java都有什么进阶技术?   看到有人给题主推荐<代码整洁之道>,评论有人说那不是JAVA进阶的书- 私以为,一些人对JAVA进阶的理解片面了,JAVA不过也是一门语言,提升和进阶还是内 ...

随机推荐

  1. (转)MySQL中的索引详讲

    序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...

  2. spark学习(3)---集合

    一.list https://blog.csdn.net/xianpanjia4616/article/details/84930779 华为文档:https://support.huawei.com ...

  3. A1. JVM 内存区域

    [概述] 在这篇笔记中,需要描述虚拟机中的内存是如何划分的,哪部分区域.什么样的代码和操作可能导致内存溢出异常.虽然 Java 有垃圾处理机制,但是如果生产环境在出现内存溢出异常时,由于开发人员不熟悉 ...

  4. Python基础之字符的编码

    参考原文 Python廖雪峰 为什么要进行编码? 计算机只能处理二进制数字(0100111),要处理文本,就必须先把文本转为数字才能处理,这个过程就叫编码. 字符的编码 ASCII编码 由于计算机是美 ...

  5. 字符串系列——KMP模板整理

    KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<i ...

  6. css--小白入门篇1

    一.引入 css用来描述html,学习css前我们先来学习html的基础标签的用法,再进入css的学习. 本教程面向小白对象,不会讲细枝末节深入的东西. 二.列表 列表有3种 2.1 无序列表 无序列 ...

  7. Many Equal Substrings CodeForces - 1029A (kmp next数组应用)

    题目大意 题目看样例也能猜到就是输出最短的循环串. 吐槽 明明是div3第一题为啥子还会用到kmp的知识? 解法 这个题仔细看发现是求最长可去除的后缀,也就是说去除跟下一个相同的字符串还能连接起来.这 ...

  8. 1007 Maximum Subsequence Sum (PAT(Advance))

    1007 Maximum Subsequence Sum (25 分)   Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A ...

  9. Tornado进阶

    三.Tornado进阶 3.1 Application settings debug,设置tornado是否工作在调试模式,默认为False即工作在生产模式.当设置debug=True 后,torna ...

  10. sql 生成某个范围内的随机数

    从i-j的范围内的随机数,那么公式为FLOOR(i+RAND()*(j-i+1))