Java虚拟游戏手柄

时间:2015-09-01 13:07:23

标签: java virtual directinput gamepad xinput

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

我想到的解决方案

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

有谁有个好主意如何解决这个问题?我考虑过使用机器人(AWT)跳过XInput并使用键盘/鼠标进行操作,但是游戏拒绝接收软件输入,很可能他们只读取硬件数据。仿真键盘/鼠标会很好,但不是最佳的,因为它会相当尴尬,但我无法找到以游戏识别方式进行操作的方法。所有帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

写一个包装器,你不需要知道任何,我重复任何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。