用C或Java捕获操纵杆输入
我需要使用C或Java捕获操纵杆输入(以较容易的为准) 对相似问题有解答,但都使用C++或C语言。< /P> 程序只需要获得操纵杆倾斜的方向和数量。 我使用的是Windows7,因此可能需要使用winmm.dll,正如前面所述。用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中这样做,我将不胜感激。这两种语言都有预制的库。更重要的问题是你必须使用哪种语言,或者你最喜欢哪种语言。仅仅为了向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.值中,该值