[DirectX][DirectInput][JoyStick]DirectInput的JoyStick创建步骤整理

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

简介:DirectInput和其他DirectX组成部分一样,是通过硬件抽象层(HAL)和硬件仿真层(HEL)来实现,处理的输入设备一般包括鼠标、键盘、游戏控制杆、操作杆等。而且现在的DirectInput还能够支持力反馈设备。

Step 1: Creating the DirectInput Object

create a single DirectInput object as overall manager.

DirectInput8Create

 

// HINSTANCE  g_hinst; // initialized earlier
HRESULT         hr;
LPDIRECTINPUT8  g_lpDI;

hr = DirectInput8Create(g_hinst, DIRECTINPUT_VERSION,
        IID_IDirectInput8, (void**)&g_lpDI, NULL);
if FAILED(hr)
{
    // DirectInput not available; take appropriate action
}


=================================================

 

Step 2: Enumerating the Joysticks

 IDirectInput8::EnumDevices

 

//g_pDI is an initialized pointer to IDirectInput8
g_pDI->EnumDevices(
DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback,
                       NULL, DIEDFL_ATTACHEDONLY)

 

 

 

=================================================

 

Step 4: Setting the Joystick Data Format

 

call the  IDirectInputDevice8::SetDataFormat  to manipulate that device

 

if (FAILED(hr = g_pJoystick->SetDataFormat(&c_dfDIJoystick2)))
    return hr;

 

typedef struct {
    LONG lX;
    LONG lY;
    LONG lZ;
    LONG lRx;
    LONG lRy;
    LONG lRz;
    LONG rglSlider[2];
    DWORD rgdwPOV[4];
    BYTE rgbButtons[128];
    LONG lVX;
    LONG lVY;
    LONG lVZ;
    LONG lVRx;
    LONG lVRy;
    LONG lVRz;
    LONG rglVSlider[2];
    LONG lAX;
    LONG lAY;
    LONG lAZ;
    LONG lARx;
    LONG lARy;
    LONG lARz;
    LONG rglASlider[2];
    LONG lFX;
    LONG lFY;
    LONG lFZ;
    LONG lFRx;
    LONG lFRy;
    LONG lFRz;
    LONG rglFSlider[2];
} DIJOYSTATE2, *LPDIJOYSTATE2;

=================================================

 

Step 5: Setting the Joystick Behavior

The joystick device has been created, and its data format has been set. The next step is to set its cooperative level.

 

if (FAILED(hr = g_pJoystick->SetCooperativeLevel(hDlg,
                    DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
    return hr;

 

The next step is to gather information about the capabilities of the joystick.

 

g_diDevCaps.dwSize = sizeof(DIDEVCAPS);//must be first initailized
if (FAILED(hr = g_pJoystick->GetCapabilities(&g_diDevCaps)))
    return hr;

 

if (FAILED(hr = g_pJoystick->EnumObjects(EnumAxesCallback,
                                       (VOID*)hDlg, DIDFT_AXIS)))
    return hr;

 

 

=================================================

 Step6: Gaining Access to the Joystick

 

 IDirectInputDevice8::Acquire

 

hr = g_pJoystick->Poll();
if (FAILED(hr))
{
    hr = g_pJoystick->Acquire();
    while(hr == DIERR_INPUTLOST)
        hr = g_pJoystick->Acquire();
    return S_OK;
}

=================================================

 

  • The DI8DEVCLASS_GAMECTRL constant specifies the class of device to be enumerated.
  • EnumJoysticksCallback is the address of a callback function to be called each time a joystick is found.
  • The third parameter can be any 32-bit value that you want to make available to the callback function.
  • The last parameter, DIEDFL_ATTACHEDONLY, is a flag that restricts enumeration to devices that are attached to the computer.

=================================================

 Step 7: Retrieving Data from the Joystick

HRESULT UpdateInputState(HWND hDlg)
{
    HRESULT     hr;
    CHAR        strText[128]; // Device state text
    DIJOYSTATE2 js;            // Direct Input joystick state
    CHAR*       str;

    if (NULL == g_pJoystick)
        return S_OK;

    // Poll the device to read the current state
    hr = g_pJoystick->Poll();
    if (FAILED(hr)) 
    {
        // Attempt to reacquire joystick
    }
    hr = g_pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js);
    if (FAILED(hr))
        return hr;

 

  • DIJOYSTATE2. This structure holds data for up to six axes, 128 buttons, and four point-of-view hats.
  • Joystick buttons work just like keys or mouse buttons. If the high bit of the returned byte is 1, the button is pressed.
  • 返回字节最高位为1,则按键处于按下状态

Step 3: Creating the DirectInput Joystick Device

 

IDirectInput8::EnumDevices枚举到设备后调用EnumJoysticksCallback回调函数,在回调函数中调用IDirectInput8::CreateDevice建立设备。

 

IDirectInput8::CreateDevice有三个参数:

1.枚举设备GUID(由DIDEVICEINSTANCE结构体提供,枚举到设备后DIDEVICEINSTANCE结构体通过指针传递给回调函数)

2.

 

The EnumJoysticksCallback callback function parameters are as follows:

  • A pointer to the device instance, supplied by the DirectInput system when the device is enumerated.
  • A pointer to a 32-bit value that you supplied as a parameter to IDirectInput8::EnumDevices

         (NULL = VOID* pContext)

 

    

BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE*    
                                       pdidInstance, VOID* pContext)
{
    HRESULT hr;

    // Obtain an interface to the enumerated joystick.
    hr = g_pDI->CreateDevice(pdidInstance->guidInstance, 
                                &g_pJoystick, NULL);
    if(FAILED(hr))
        return DIENUM_CONTINUE;

    return DIENUM_STOP;

 

=================================================

 

[C++][DirectX]Joystick分享 [C++][DirectX]Joystick分享。 阅读详情

相关推荐

掌握DirectXDirectInput —— 力反馈游戏杆

掌握DirectXDirectInput——力反馈游戏杆Jason Clark     不知不觉中,Windows下的游戏和多媒体程序已经开始流行。硬件变得越来越快,Windows也变得更加灵活。自从Microsoft发布了DirectX,游戏开发人员对其它平台已经越来越不感兴趣了。许多游戏开发者也已经将他们的开发工作完全移植到了Windows下。     为PC开发游戏从来就没有轻

coolstar的调侃 3821

C#使用DirectX获取摇杆外设状态

C#监听摇杆状态 详情请看文章 https://blog.csdn.net/q771410116/article/details/136688340

C#手柄开发实战:XInput与Raw Input底层解析与抗干扰轮询

游戏手柄输入是人机交互的基础技术之一,其本质是Windows平台下对HID设备的实时信号采集与处理。理解XInput协议的低延迟特性、Raw Input对全品牌手柄的通用支持能力,以及死区校准、轮询频率、热插拔响应等关键原理,是构建稳定输入系统的技术前提。在工业HMI、VR交互、模拟器前端等对可靠性与实时性要求严苛的场景中,仅依赖高层封装(如XNA)极易导致连接丢失、数据跳变或跨平台失效。本文聚焦C#在Windows原生环境下的手柄接入实践,深入解析HID报告描述符结构、WM_INPUT消息处理机制及多设备

didi9310的博客 317

Windows平台下使用DirectXDirectInput8)进行Joystick编程

在Windows平台下使用DirectInput8接口,对joystick进行编程。 共2个文件:《DirectInput8开发手册》和Joystick.cpp(代码) 编译器:Visual Studio 2017 主要包含头文件: #include #include

极简主义DirectX开发第一弹:DirectInput手柄操作

目的:简化开发学习过程,以最小代码清晰展示某功能的实现。手柄设备和键盘鼠标是不同的,因为手柄不是必须的输入设备,因此系统没有事先定义好GUID供用户调用,并且手柄设备差异很大,因此只能用轮询来获得手柄设备的ID.本文为新手解释了如何初始化DirectInput设备为手柄,高手请忽略。整体思路是这样的,首先创建DirectInput对象,之后用这个对象来轮询设备,从而获得可用的设备ID,之后通过这个...

Mathias的博客 3438

JoyStick(游戏手柄)与C#

前言这是我的第一篇技术博客,希望能为大家提供些有用信息。 概述       前段时间有一项工作是通过游戏手柄控制云台,通过google和msdn搞定了,在这吧就总结一下吧。问题        对于手柄控制主要有以下几个问题 在合适的时机获取游戏手柄的输入? 一般游戏手柄都是有n个方向键和n个功能键控制的,要确认各个键的状态? 解决方案

fedora08的程序专栏 1万+

Thrustmaster Hotas Warthog/猪杆/疣猪飞行操作杆开发(2)

距离《Thrustmaster Hotas Warthog/猪杆/疣猪飞行操作杆开发》的出生已经过去了半年了,最近项目上又要用到飞行操作杆,所以,我也乘此机会进一步整理一下上一次没有说完整的后续开发细节,也就是关于 显示更多的操作杆数据的方法—使用图形设备接口函数’windows.h’(并不是MFC奥)上一次只是显示了操作杆的X、Y轴的数据,这一次就以添加显示一个按钮为例,来直接进入主题。接着,按步

JassionJohn的专栏 3634

运用directinput同时读取多个游戏操纵杆信号

    最近在读取操纵杆、油门杆、脚蹬三个操作杆的信号,现有MFC只提供两个操纵杆读取接口JOYSTICKID1、JOYSTICKID2,要是想读取三个操纵杆信号就需要另想办法。师兄的方法是利用两个MFC接口读取两个操纵杆,再用directX读取一个操纵杆,个人感觉这样比较复杂,要是用directX同时将三个操纵杆一次读取出来就好了。在CSDN上下了一个代码joystick_demo,界面如下:但...

awesomelatitude的博客 1382

游戏手柄(JoyStick)编程学习笔记(1)

游戏手柄(JoyStick)编程学习笔记(1)最近我开发的一个项目中需要用手柄控制一个二维移动平台的运动,找了些工业用的操作杆,感觉都挺丑的。后来想到打游戏时用的游戏手柄就挺漂亮,就决定试试用游戏手柄作为控制手柄来用。上网查了查,在 WINDOWS 下编程控制游戏手柄比较主流的技术是用 DirectInput。如果不需要复杂的控制功能,也可以直接使用 WIN API (multimedia joys

Ivan 的专栏 3万+

JoyStick游戏杆编程实践

概述 最近突然对如何编程读取手柄输入比较感兴趣。所以上网找了找相关的资料,发现没有什么简单明了的教程,所以在此将收集到到跟joystick手柄编程相关资料整理一下,方便大家参考使用。 JoyStick简介 先给出JoyStick的维基百科介绍 维基百科词条:JoyStick 按照维基百科中的介绍,JoyStick事实上就是电子输入装置,可以输入按键,方向等数据。可以用来控制电子游戏,也可以用来控制...

yu_lei_的博客 1万+

AirSim_SimJoyStick

本文介绍了一个跨平台的游戏手柄输入系统,支持Windows和Linux平台。系统采用分层设计,Windows端基于DirectInput API实现完整功能,包括力反馈;Linux端通过/dev/input/js*设备文件实现基础功能。核心类SimJoyStick提供统一接口,支持设备自动识别、灵活的轴映射配置和力反馈控制。系统采用PIMPL模式隐藏实现细节,具有良好封装性和跨平台适应性,特别适合模拟器和游戏开发场景。

FlyingMindIndex0的博客 429

directx joysitck 程序示例

//-----------------------------------------------------------------------------  // File: Joystick.cpp  //  // Desc: Demonstrates an application which receives immediate   //       joystick data in ex

mrpayne的专栏 1467

DirectInput:游戏输入的高速直达通道

摘要: DirectInput是微软DirectX的组件,用于直接读取键盘、鼠标等输入设备数据,绕过Windows消息队列以降低延迟。类比中,普通输入像“服务员传菜”,而DirectInput如同“自助取餐”,让游戏程序直接从硬件驱动获取数据。它支持独占设备、多设备兼容(如方向盘),适用于需要高响应速度的场景(如游戏),通过初始化设备、独占控制和实时数据读取实现高效输入处理。(149字)

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1216

全面解读:如何通过DirectInput从游戏杆获取数据

DirectInput不仅提供了基本的输入设备访问,还允许开发者使用高级API来模拟设备的输入以及实现力反馈控制。例如,接口用于创建和播放力反馈效果,从而提供物理反馈给用户。创建一个力反馈效果通常涉及到几个步骤:初始化接口。定义效果的类型和参数,比如是一个周期性效果还是单一效果。设置效果的属性,例如持续时间、大小和方向。加载和验证效果。播放效果。停止和释放效果。

weixin_42476987的博客 1016

DirectInput编程基础-游戏手柄编程

导读:   DirectInput编程基础 - 简介 出 处: 中国游戏开发者   [ 2001-09-09] 作 者:   目 录   1.1 DirectInput概念   1.2 设置DirectInput   1.3 列举设备   1.4 设置设备   1.5 取得输入数据   绪言   输入相对于图形和声音而言从未成为游戏开发中的非常重要的论题。读取键盘按

maxos的专栏 4761
上一篇: [MFC][函数使用]StringCchPrintf()(未解决)
下一篇: [MFC][DirectInput]MFC下DirectX DirectInput的实现(有部分删改)
hicoder
博客等级 码龄16年 0粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值