三自由度的动感座椅可以让玩游戏人员在玩的过程中随座椅一起晃动,通过应用程序对方向盘动作的抓取来实现体感,动作类型主要分为加速(后仰,对应踩油门)、减速(前倾,对应踩刹车 )、左转(向左打方向盘)、右转(向右打方向盘)。座椅通过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. Django REST framework 数据处理api

    一.url分发 以防有其他业务线的需要,导致url杂乱,将每个app用到的url都设置在自己的应用中. # 项目下的url url(r"^api/(?P<version>\w+) ...

  2. C#创建excel并释放资源

    using System; using Microsoft.Office.Interop.Excel; using Excel = Microsoft.Office.Interop.Excel; us ...

  3. mesh topology for airfoil, wing, blade, turbo

    ref Ch. 5, Anderson, CFD the basics with applications numerical grid generation foundations and appl ...

  4. lombok 插件安装

    1. 下载地址: https://plugins.jetbrains.com/plugin/6317-lombok-plugin 2. 选择从本地安装.

  5. android保存bitmap到sdcard

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //判断sdcard是否存在和是否具有读写 ...

  6. 在设计DJANGO用户更改密码时,出现NoReverseMatch at /account/password-change/这种妖精如何办?

    网上看到很多解决办法.但对于我来说, 好像加个post_change_redirect这个参数是最有效的. from django.conf.urls import url from . import ...

  7. hdu 1247 Hat’s Words(从给的单词中找hat&#39;s word 并按字典序输出)

    1.在使用mp[key]的时候它会去找键值为key的项,假设没有,他会自己主动加入一个key的项,再把value赋值为对应的初始值(value是int的话赋值为0,string的话赋值为空).所以假设 ...

  8. PKU 3667 Hotel (线段树,区间合并,最长连续区间)

    题意:宾馆有N个房间(1~N),M个操作,a=1,输入b,表示N间房是否有连续的b间房.有输出最左边的房编号 没有输出0.a=2,输入b,c表示房间b到c清空. 模仿了大神的代码,敲了一遍,有些地方还 ...

  9. JBoss AS6 的服务状态说明

    (本文源码版本号为JBoss-AS-Final 6.1.0) JBoss 的服务状态定义在 LifecycleState 类中. 一共同拥有八个状态:INSTANCIATED, PRE_INIT, I ...

  10. Java推断和检查网络

    在实践项目中.常常要处理网络异常等问题.为此,专门设计一个类,随时能够使用. import java.io.IOException; import java.net.InetAddress; impo ...