问题标签 [gamepad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
874 浏览

java - 如何在没有 API 的情况下为 GamePad 编写 ActionListener:从哪里开始?

有几种解决方案以 API 的形式用于检测 GamePad 输入,但我无法从头开始找到它是如何完成的。我对几种类型的听众进行了测试,他们似乎没有检测到我的 XBOX360 控制器上的按钮按下。我不知道从哪里开始...我需要编写自己的驱动程序吗?JInput 是如何做到的?

0 投票
1 回答
126 浏览

c# - 手动调用鼠标点击 XNA

我希望制作一个与游戏手柄一起使用的简单程序,并且可以从程序外部控制鼠标和关键字事件。我的目标是能够在沙发上控制电脑。

我当前的代码在Update()

编辑: 为了发送按键,我找到了这个

0 投票
1 回答
2588 浏览

android - 如何切换安卓游戏手柄的轴?

在我的情况下,我在 Xinput 模式下使用 Logitech F310(它有一个开关可以在 DirectInput 和 Xinput 之间进行选择)。我写了一个小应用程序,它读取游戏手柄的轴值。事实证明,右侧模拟摇杆使用轴MotionEvent.AXIS_RXMotionEvent.AXIS_RY而两个肩部模拟触发器使用轴MotionEvent.AXIS_ZMotionEvent.AXIS_RZ

但根据文档AXIS_Z 和 AXIS_RZ 应该用于正确的模拟摇杆:

公共静态最终 int AXIS_RZ

轴常数:运动事件的 Z 旋转轴。

对于操纵杆,报告关于 Z 轴的绝对旋转角度。该值被标准化为从 -1.0(逆时针)到 1.0(顺时针)的范围。在带有两个模拟操纵杆的游戏手柄上,该轴通常被重新解释为报告第二个操纵杆的绝对 Y 位置。

这是游戏中的一个问题,它不提供重新映射游戏手柄的按钮和模拟摇杆的选项。例如 GTA San Andreas 认为这两个模拟触发器是正确的模拟摇杆。但由于触发器的中性值在未按下时为 -1 而不是 0,就像模拟摇杆处于中性状态一样,相机不断旋转。(此游戏中使用右侧模拟摇杆移动相机)

轴映射保存在哪里?它是在游戏手柄中硬编码的吗?还是在 Linux 设备子系统中分配?或者可能在 android InputDevice 框架内?如果是这样,它可以改变吗?

另一种可能的解决方案是拦截事件调度程序和接收应用程序之间的 MotionEvents 并更改轴值。在android中这或类似的可能吗?甚至可能在较低级别:通过 root 访问,可以从 /dev/input/event6 设备(在我的情况下 event6 是游戏手柄)读取原始输入数据。是否可以用调整后的轴值不断覆盖这个文件?

0 投票
1 回答
476 浏览

windows - 独家直接输入

我正在尝试构建一个对游戏手柄具有独占访问权限的应用程序。这意味着当我的应用程序运行时,没有其他应用程序将接收或响应游戏手柄操作,如按钮按下、滚轮移动……

我目前的方法是使用 DirectInput,设置标志:DISCL_EXCLUSIVE | DISCL_BACKGROUND。

但是,我意识到 DISCL_EXCLUSIVE 似乎没有效果?每当我设置 DISCL_EXCLUSIVE 或 DISCL_NONEXCLUSIVE 它都是一样的。

昨天我发现了这个:http ://www.gamedev.net/topic/656250-directinput-exclusive-access-to-joypad/ 根据他提到的,这个标志什么都不做?

那么我的问题还有其他解决方案吗?谢谢。

0 投票
0 回答
41 浏览

windows - 如何在 Windows 系统中甚至从窗口管理器中独占 HID 设备

对不起,我是窗口技术的新手。我现在可以通过 RawInput 或 DirectInput 从设备读取输入数据。但是,我担心:我想要一个服务(称为 X )可以从游戏手柄(ForeGround 和 BackGround 状态)读取数据。X 可以断开 Window manager 和 Gamepad 之间的关联吗?谢谢

0 投票
2 回答
499 浏览

java - 频繁检查 LWJGL/JInput 游戏手柄按钮或轴时出现延迟,如何解决?

我正在为 Android/OUYA 和 PC 在 Java 上创建一个多平台(但支持 OpenGL)游戏引擎,并且在快速检查游戏手柄状态时,PC 平台适配器给了我一些问题。

我目前正在使用 LWJGL/JInput 编写 PC 适配器,并且每当我以超过每秒 30 次的速度轮询游戏手柄状态时(大约 33 毫秒进行轮询和更新状态),从游戏手柄获得的值都是错误的。假的意思是摇杆可以在右边的一半,但 getAxisValue 返回 0 而不是 1f 中接近 0.5f 的东西。最重要的是,它似乎需要比 33ms 更长的时间,否则当被要求更频繁地执行此操作时会很好。是什么赋予了?

简而言之,在典型的更新调用中发生的情况是,引擎会扫描活跃玩家的控制器,以了解游戏中实际使用的特定按钮的状态,所有这些都提前设置和注册。目前,在我的测试应用程序中,它由两个按钮和一个轴组成。所以它所做的只是检查三个输入的当前状态,仅此而已。在通过几层接口并进入一个开关块之后,最终这被称为:

或者

其中 map 包含将名称链接到给定控制器的特定索引值的最终整数。

我通过自己的测试发现:

  • 这不是硬件问题,因为它在低于每秒 30 到 35 次更新时保持相当准确。
  • 当将速度提高到每秒更新约 60 次以匹配图形线程的 60fps 速率时,它只会导致输入线程的大量延迟。图形线程不受影响,这让我认为这也不是一般的性能问题。
  • 将 isButtonPressed 或 getAxisValue 更改为任意预设值可解决更新滞后问题,因此不是我的代码导致间歇性停止,绝对是 isButtonPressed 和 getAxisValue。

有什么方法可以提高游戏手柄检查的速度,或者我错过的某个设置通过 LWJGL/JInput 禁用了不必要的输入例程?

在性能方面要求匹配 60fps 是否太多?

0 投票
1 回答
235 浏览

c++ - JOYBUTTON_5 是否在 mmsystem.h 中错误定义?

我目前正在编写一些 C++ 代码来检测游戏手柄按钮按下。我正在使用以下代码来定义一组可能的按钮按下:

然后使用类似下面的东西来检测按下了哪个按钮:

这适用于游戏手柄按钮 1-4。但是,按钮 5-32 不起作用。例如,当按下游戏手柄上的按钮 5 时,程序认为dwButtons设置为 16。JOY_BUTTON5定义mmsystem.h为 257。所以在我看来, JOY_BUTTON5 - 32 在 mmsystem 中定义不正确。是这样吗,还是我错过了什么?

0 投票
1 回答
481 浏览

macos - OsX 中 USB HID API 的回调永远不会被游戏手柄或其他任何东西调用

我正在尝试在我的游戏中检测并使用连接到我的 Mac 的游戏手柄。我为此使用了 IOKit,但没有成功。当我下载了一个查看所有附加游戏手柄的 Mac 应用程序时,游戏手柄被识别。它是罗技 F310,我已将其设置为 DirectInput。我在 awakeFromNib 中调用 setupInput 但没有调用任何回调。没有抛出错误或异常。我不知道为什么不调用回调。我究竟做错了什么?我在想这可能是运行循环的问题。我尝试了 CFRunLoopGetMain 和 CFRunLoopGetCurrent。

不知道还能做什么。

编辑:正如某人所建议的那样,我尝试将相同的 GamePad 代码放入一个新项目中并且它有效。类的结构存在一些差异,但即使我尝试复制这些类,我也无法使其在我的应用程序中工作。我的应用程序使用 AppDelegate 和 NSOpenGLView。奇怪的是它没有 NSViewController。最小的应用程序使用 NSOpenGLView 也使用 NSResponder ,当我将游戏手柄代码放在(自定义)NSResponder 类中时,它“工作”(检测游戏手柄并响应输入)。我试图将该自定义类添加到我的应用程序中,但它“不起作用”。我错过了什么?

0 投票
1 回答
521 浏览

c++ - 如何编写程序可以检测 C++ 中游戏手柄按钮的信号?

我想探索一下我的游戏手柄按钮的信号,它很旧但可以使用。我想编写一个小程序,当我在 C++ 中触摸这些按钮时,它可以检测并显示这些按钮的“代码”,任何人都可以帮助我,我不知道从哪里开始?请 !!!

0 投票
1 回答
1928 浏览

c - inotify 事件后无法打开 /dev/input/js 文件描述符

我正在为一个游戏库创建一个 Linux 模块,它可以让你热插拔多个游戏杆,它使用 inotify 来观看/dev/input.

我正在用 3 个操纵杆对其进行测试:

  • 首先,我连接了 2 个操纵杆。
  • 然后我启动应用程序,操纵杆工作,我没有收到错误。
  • 之后我连接第三个操纵杆,perror给出:/dev/input/js1: Permission denied
  • 当我检查ls -l /proc/<pid-of-process>/fd它列出/dev/input/js0/dev/input/js2.

当我以 root 身份运行时,所有的操纵杆都可以正常工作。

这是它的初始化方式:

之后 inotify 在while(1)循环中像这样处理它:

甚至可以使用 inotify 还是应该使用 udev?如果可能的话,我该如何解决这个问题?