用C或Java捕获操纵杆输入

用C或Java捕获操纵杆输入,java,c,input,joystick,Java,C,Input,Joystick,我需要使用C或Java捕获操纵杆输入(以较容易的为准) 对相似问题有解答,但都使用C++或C语言。< /P> 程序只需要获得操纵杆倾斜的方向和数量。 我使用的是Windows7,因此可能需要使用winmm.dll,正如前面所述。 如果有人能解释一下如何在C或Java中这样做,我将不胜感激。这两种语言都有预制的库。更重要的问题是你必须使用哪种语言,或者你最喜欢哪种语言。仅仅为了向Java程序中添加这样的功能而添加C代码并不一定有意义。以类似的方式,您不希望从C调用Java,而只是为了获得操纵杆输入

我需要使用C或Java捕获操纵杆输入(以较容易的为准)

对相似问题有解答,但都使用C++或C语言。< /P> 程序只需要获得操纵杆倾斜的方向和数量。 我使用的是Windows7,因此可能需要使用winmm.dll,正如前面所述。

如果有人能解释一下如何在C或Java中这样做,我将不胜感激。

这两种语言都有预制的库。更重要的问题是你必须使用哪种语言,或者你最喜欢哪种语言。仅仅为了向Java程序中添加这样的功能而添加C代码并不一定有意义。以类似的方式,您不希望从C调用Java,而只是为了获得操纵杆输入

谷歌“java操纵杆”的第一个成功例子是。我还没试过

<>对于C++代码(并且最有可能也是C),如果C是纯Windows API代码(因为其中一个也是C),则应该能够在C中使用相同的代码。所以你不应该有任何问题来适应这些

编辑:
关于您链接的答案:您应该能够在C中使用这个1:1的解决方案(在Java中,您必须编写基本上相同的代码)。但是不要自己声明所有内容,只需包含即可(在C语言中)。

有两种语言的预制库。更重要的问题是你必须使用哪种语言,或者你最喜欢哪种语言。仅仅为了向Java程序中添加这样的功能而添加C代码并不一定有意义。以类似的方式,您不希望从C调用Java,而只是为了获得操纵杆输入

谷歌“java操纵杆”的第一个成功例子是。我还没试过

<>对于C++代码(并且最有可能也是C),如果C是纯Windows API代码(因为其中一个也是C),则应该能够在C中使用相同的代码。所以你不应该有任何问题来适应这些

编辑:
关于您链接的答案:您应该能够在C中使用这个1:1的解决方案(在Java中,您必须编写基本上相同的代码)。但是不要自己声明所有内容,只需包含,您应该准备好(在C中)。

您链接到的示例实际上没有使用任何面向对象的工具,这意味着您可以非常轻松地将其移植到C

C支持
struct
s,与C#(在堆栈上分配)相同,因此基本上是复制粘贴


有一件事可能会让你绊倒,那就是
[DllImport]
属性。此属性的用途是从托管C#代码中p/invoke(平台调用)非托管DLL。在这里,您可以使用
extern
访问Windows API。

您链接到的示例实际上没有使用任何面向对象的工具,这意味着您可以非常轻松地将其移植到C

C支持
struct
s,与C#(在堆栈上分配)相同,因此基本上是复制粘贴

有一件事可能会让你绊倒,那就是
[DllImport]
属性。此属性的用途是从托管C#代码中p/invoke(平台调用)非托管DLL。这里您可以使用
extern
访问Windows API。

我建议使用纯C解决方案。图书馆使用起来很方便,而且它们的功能非常强大:

SDL_Joystick *joy;

// Initialize the joystick subsystem
SDL_InitSubSystem(SDL_INIT_JOYSTICK);

// Check for joystick
if(SDL_NumJoysticks()>0){
  // Open joystick
  joy=SDL_JoystickOpen(0);
  ...
我建议使用纯C解决方案。图书馆使用起来很方便,而且它们的功能非常强大:

SDL_Joystick *joy;

// Initialize the joystick subsystem
SDL_InitSubSystem(SDL_INIT_JOYSTICK);

// Check for joystick
if(SDL_NumJoysticks()>0){
  // Open joystick
  joy=SDL_JoystickOpen(0);
  ...
这确实是纯Windows API代码! 在C语言中,只需包含,而不是[DllImport(“winmm.dll”)] 您可以链接到
winmm.lib
。下面的例子应该说明这一点:

void printJoystickData()
{
   // The captured data will be written to the following struct:
   //typedef struct joyinfo_tag {
   //   UINT wXpos;
   //   UINT wYpos;
   //   UINT wZpos;
   //   UINT wButtons;
   //} JOYINFO,*PJOYINFO,*LPJOYINFO;
   JOYINFO joystickInfo;

   // The ID of the joystick you are using. If there is only one joystick use JOYSTICKID1.
   UINT joystickId = JOYSTICKID1;

   MMRESULT errorCode = joyGetPos(joystickId, &joystickInfo);
   switch(errorCode)
   {
       case JOYERR_NOERROR: // No error. joystickInfo now contains contains the captured data.
       {
           printf("The X position (left/right tilt) is %u\n", joystickInfo.wXpos);
           printf("The Y position (up/down tilt) is %u\n", joystickInfo.wYpos);
           printf("The Z position (usually the throttle) is %u\n", joystickInfo.wZpos);
           // These values range from 0 to 65536. 32768 is the centre position.

           // Test button 1. You can do the same for JOY_BUTTON2, JOY_BUTTON3 etc.
           // wButtons is a UNINT that is the OR of all pressed button flags.
           if(joystickInfo.wButtons & JOY_BUTTON1)
               printf("Button 1 was pressed.");

           break;
       }
       case JOYERR_PARMS: fprintf(stderr, "Invalid parameters to joyGetPos."); break;
       case JOYERR_NOCANDO: fprintf(stderr, " Failed to capture joystick input."); break;
       case JOYERR_UNPLUGGED: fprintf(stderr, "The joystick identified by joystickId isn't plugged in."); break;
       case MMSYSERR_NODRIVER: fprintf(stderr, "No (active) joystick driver available."); break;
   }
}
简单的Directmedia层库(由blahdiblah建议)看起来也很有希望,但对于我需要做的事情,我认为上面的代码更简单

对于Java,请按照Mario的建议使用。下载内容包括文档。

这确实是纯Windows API代码! 在C语言中,只需包含,而不是[DllImport(“winmm.dll”)] 您可以链接到
winmm.lib
。下面的例子应该说明这一点:

void printJoystickData()
{
   // The captured data will be written to the following struct:
   //typedef struct joyinfo_tag {
   //   UINT wXpos;
   //   UINT wYpos;
   //   UINT wZpos;
   //   UINT wButtons;
   //} JOYINFO,*PJOYINFO,*LPJOYINFO;
   JOYINFO joystickInfo;

   // The ID of the joystick you are using. If there is only one joystick use JOYSTICKID1.
   UINT joystickId = JOYSTICKID1;

   MMRESULT errorCode = joyGetPos(joystickId, &joystickInfo);
   switch(errorCode)
   {
       case JOYERR_NOERROR: // No error. joystickInfo now contains contains the captured data.
       {
           printf("The X position (left/right tilt) is %u\n", joystickInfo.wXpos);
           printf("The Y position (up/down tilt) is %u\n", joystickInfo.wYpos);
           printf("The Z position (usually the throttle) is %u\n", joystickInfo.wZpos);
           // These values range from 0 to 65536. 32768 is the centre position.

           // Test button 1. You can do the same for JOY_BUTTON2, JOY_BUTTON3 etc.
           // wButtons is a UNINT that is the OR of all pressed button flags.
           if(joystickInfo.wButtons & JOY_BUTTON1)
               printf("Button 1 was pressed.");

           break;
       }
       case JOYERR_PARMS: fprintf(stderr, "Invalid parameters to joyGetPos."); break;
       case JOYERR_NOCANDO: fprintf(stderr, " Failed to capture joystick input."); break;
       case JOYERR_UNPLUGGED: fprintf(stderr, "The joystick identified by joystickId isn't plugged in."); break;
       case MMSYSERR_NODRIVER: fprintf(stderr, "No (active) joystick driver available."); break;
   }
}
简单的Directmedia层库(由blahdiblah建议)看起来也很有希望,但对于我需要做的事情,我认为上面的代码更简单


对于Java,请按照Mario的建议使用。下载内容包括文档。

有关Gamepad.c和Gamepad.h文件,请参阅此url。

使用打开操纵杆

STATE.fd = open(STATE.device, O_RDWR|O_NONBLOCK);
结构定义:

状态是一个结构对象。 //它在Gamepad.h文件中

打开返回失败时为-1。 如果成功打开,则设置标志值(在为操纵杆声明变量时定义)

使用读取操纵手柄输入

     (read(STATE[gamepad].fd, &je, sizeof(je)) > 0) 
结构定义: je是一个结构对象 //它在操纵杆中

je现在更新了。 je.type是mogage.h头文件中提到的三件事之一 如果按下按钮,则je.number是一个int,表示制造商指定的按钮编号。如果移动斗杆,则je.编号表示制造商提供的轴规格。
大小出现在je.value中,该值被相应地分配给杆的相应变量。

有关Gamepad.c和Gamepad.h文件,请参考此url。

使用打开操纵杆

STATE.fd = open(STATE.device, O_RDWR|O_NONBLOCK);
结构定义:

状态是一个结构对象。 //它在Gamepad.h文件中

打开返回失败时为-1。 如果成功打开,则设置标志值(在为操纵杆声明变量时定义)

使用读取操纵手柄输入

     (read(STATE[gamepad].fd, &je, sizeof(je)) > 0) 
结构定义: je是一个结构对象 //它在操纵杆中

je现在更新了。 je.type是mogage.h头文件中提到的三件事之一 如果按下按钮,则je.number是一个int,表示制造商指定的按钮编号。如果移动斗杆,则je.编号表示制造商提供的轴规格。 震级出现在je.值中,该值