我需要使用C或Java捕获操纵杆输入(以更容易的方式)。
有类似问题的答案,但它们都使用C ++或C#。
程序只需要获取操纵杆倾斜的方向和数量。 我正在使用Windows7,所以我可能需要使用winmm.dll,如here所述 如果有人能用C或Java解释如何这样做,我将不胜感激。
答案 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中,相应地分配给棒的相应变量。