用C或Java捕获操纵杆输入

时间:2012-01-28 09:54:19

标签: java c input joystick

我需要使用C或Java捕获操纵杆输入(以更容易的方式)。

有类似问题的答案,但它们都使用C ++或C#。

程序只需要获取操纵杆倾斜的方向和数量。 我正在使用Windows7,所以我可能需要使用winmm.dll,如here所述 如果有人能用C或Java解释如何这样做,我将不胜感激。

5 个答案:

答案 0 :(得分:2)

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

首次在谷歌上搜索“java游戏杆”已经this one。尚未尝试过。

对于C ++代码(也很可能是C#),您应该能够在C中使用相同的代码,假设它是纯Windows API代码(因为它也是C语言代码)。所以你不应该有任何适应这些的问题。

编辑: 关于你链接的答案:你应该能够在C中以1:1的比例使用这个解决方案(在Java中你必须编写基本上做同样的代码)。但不是自己宣布一切,而是#include <windows.h>而你应该准备好(在C中)。

答案 1 :(得分:1)

我推荐Simple Directmedia Layer library用于纯C解决方案。图书馆使用起来很愉快,他们的documentation and code examples很棒:

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);
  ...

答案 2 :(得分:1)

C# solution确实是纯Windows API代码! 在C #include <windows.h>而不是[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;
   }
}

Simple Directmedia Layer库(由blahdiblah建议)也看起来很有希望但是我需要做的事情我认为上面的代码更简单。

对于Java,请使用Mario建议的Central Nexus Device API。下载包括文档。

答案 3 :(得分:0)

您链接到的示例实际上并未使用面向对象的任何内容,这意味着您可以非常轻松地将其移植到C语言。

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

可能会引起你兴趣的是[DllImport]属性。此属性的目的是从托管C#代码中p / invoke(平台调用)非托管DLL。在这里,您将使用extern来访问Windows API。

答案 4 :(得分:0)

请参阅此URL以获取Gamepad.c和Gamepad.h文件。 https://github.com/elanthis/gamepad

使用

打开操纵杆
STATE.fd = open(STATE.device, O_RDWR|O_NONBLOCK);

结构定义:

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

失败后,

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

使用

读取操纵杆输入
     (read(STATE[gamepad].fd, &je, sizeof(je)) > 0) 

结构定义: je是一个结构对象 //它在joystick.h中

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