【问题标题】:Java Virtual GamepadJava 虚拟游戏手柄
【发布时间】:2015-11-26 17:50:14
【问题描述】:

问题 我正在开发一个自定义硬件控制器,我想在用 Java 处理它之后将它的输入映射到一个虚拟 XInput 控制器。基本上出于所有意图和目的,我想直接从 java 控制 XInput 控制器。

我想到的解决方案

  • 编写设备驱动程序,这似乎是一个真正的痛苦,我很乐意避免。我以前从未编写过设备驱动程序,也不知道如何注册 XInput 控制器。这似乎需要很长时间才能完成,我没有也不想花时间。
  • 使用 PPJoy 和 this 库。我想避免这种情况,因为 PPJoy 已经过时了(自我能找到的上次更新以来已超过 10 年),并且需要一个额外的层来将 DirectInput 转换为 XInput。该库也拒绝为我编译。
  • VJoy 开发一个包装器。然而,这需要从 DirectInput 重新映射到 XInput。我不熟悉 C/C++ 包装,但到目前为止,这似乎是最好的选择。

有没有人知道如何解决这个问题?我曾考虑跳过 XInput 并使用机器人 (AWT) 使用键盘/鼠标来完成,但游戏拒绝接收软件输入,很可能它们只读取硬件数据。模拟键盘/鼠标会很好但不是最佳的,因为它会很尴尬,但是我无法找到一种方法来以游戏识别的方式来做。感谢所有帮助!

【问题讨论】:

    标签: java virtual directinput gamepad xinput


    【解决方案1】:

    编写一个包装器,你不需要知道任何东西,如果你真的不想,我会重复任何 C++ 代码。只需使用swig。有很多例子,从 basic 开始。 (注意我不打算包括例子,因为那里已经有足够的东西了)。如果您有问题发表评论,我会帮助您。

    编辑 好的,我会很好,快速示例,假设您有一个 example.h 文件,在同一位置创建一个 example.i:

    %module example
    
    %{
    #include "example.h"
    %}
    
    %include "example.h"
    

    确保 swig 在你的路径中然后执行:

    %swig -java example.i
    

    然后你需要构建一个原生的java库,比如它是怎么做的here,(注意你不需要做所有javah的东西),但基本上:

    % g++ -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" 
      -shared -o example.dll example.c example.cpp
    

    它为您提供了您的 dll,在运行您的 java 程序时,您必须将其与任何其他依赖库一起保留在您的路径中。注意如果你编译一个 32 位的库,你需要使用一个 32 位的 jvm。

    【讨论】:

    • 谢谢 :) 稍后我会试试看,好像我吃了一些不好的东西,所以我现在躺在床上,无法尝试。 VJoy 的包装器似乎是最好的选择。并不是我不能读/写 c++,我只是很乐意避免这样做。制作包装器似乎也是非常有用的学习知识。
    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多