问题标签 [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.
java - 如何在没有 API 的情况下为 GamePad 编写 ActionListener:从哪里开始?
有几种解决方案以 API 的形式用于检测 GamePad 输入,但我无法从头开始找到它是如何完成的。我对几种类型的听众进行了测试,他们似乎没有检测到我的 XBOX360 控制器上的按钮按下。我不知道从哪里开始...我需要编写自己的驱动程序吗?JInput 是如何做到的?
android - 如何切换安卓游戏手柄的轴?
在我的情况下,我在 Xinput 模式下使用 Logitech F310(它有一个开关可以在 DirectInput 和 Xinput 之间进行选择)。我写了一个小应用程序,它读取游戏手柄的轴值。事实证明,右侧模拟摇杆使用轴MotionEvent.AXIS_RX
,MotionEvent.AXIS_RY
而两个肩部模拟触发器使用轴MotionEvent.AXIS_Z
和MotionEvent.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 是游戏手柄)读取原始输入数据。是否可以用调整后的轴值不断覆盖这个文件?
windows - 独家直接输入
我正在尝试构建一个对游戏手柄具有独占访问权限的应用程序。这意味着当我的应用程序运行时,没有其他应用程序将接收或响应游戏手柄操作,如按钮按下、滚轮移动……
我目前的方法是使用 DirectInput,设置标志:DISCL_EXCLUSIVE | DISCL_BACKGROUND。
但是,我意识到 DISCL_EXCLUSIVE 似乎没有效果?每当我设置 DISCL_EXCLUSIVE 或 DISCL_NONEXCLUSIVE 它都是一样的。
昨天我发现了这个:http ://www.gamedev.net/topic/656250-directinput-exclusive-access-to-joypad/ 根据他提到的,这个标志什么都不做?
那么我的问题还有其他解决方案吗?谢谢。
windows - 如何在 Windows 系统中甚至从窗口管理器中独占 HID 设备
对不起,我是窗口技术的新手。我现在可以通过 RawInput 或 DirectInput 从设备读取输入数据。但是,我担心:我想要一个服务(称为 X )可以从游戏手柄(ForeGround 和 BackGround 状态)读取数据。X 可以断开 Window manager 和 Gamepad 之间的关联吗?谢谢
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 是否太多?
c++ - JOYBUTTON_5 是否在 mmsystem.h 中错误定义?
我目前正在编写一些 C++ 代码来检测游戏手柄按钮按下。我正在使用以下代码来定义一组可能的按钮按下:
然后使用类似下面的东西来检测按下了哪个按钮:
这适用于游戏手柄按钮 1-4。但是,按钮 5-32 不起作用。例如,当按下游戏手柄上的按钮 5 时,程序认为dwButtons
设置为 16。JOY_BUTTON5
定义mmsystem.h
为 257。所以在我看来, JOY_BUTTON5 - 32 在 mmsystem 中定义不正确。是这样吗,还是我错过了什么?
macos - OsX 中 USB HID API 的回调永远不会被游戏手柄或其他任何东西调用
我正在尝试在我的游戏中检测并使用连接到我的 Mac 的游戏手柄。我为此使用了 IOKit,但没有成功。当我下载了一个查看所有附加游戏手柄的 Mac 应用程序时,游戏手柄被识别。它是罗技 F310,我已将其设置为 DirectInput。我在 awakeFromNib 中调用 setupInput 但没有调用任何回调。没有抛出错误或异常。我不知道为什么不调用回调。我究竟做错了什么?我在想这可能是运行循环的问题。我尝试了 CFRunLoopGetMain 和 CFRunLoopGetCurrent。
不知道还能做什么。
编辑:正如某人所建议的那样,我尝试将相同的 GamePad 代码放入一个新项目中并且它有效。类的结构存在一些差异,但即使我尝试复制这些类,我也无法使其在我的应用程序中工作。我的应用程序使用 AppDelegate 和 NSOpenGLView。奇怪的是它没有 NSViewController。最小的应用程序使用 NSOpenGLView 也使用 NSResponder ,当我将游戏手柄代码放在(自定义)NSResponder 类中时,它“工作”(检测游戏手柄并响应输入)。我试图将该自定义类添加到我的应用程序中,但它“不起作用”。我错过了什么?
c++ - 如何编写程序可以检测 C++ 中游戏手柄按钮的信号?
我想探索一下我的游戏手柄按钮的信号,它很旧但可以使用。我想编写一个小程序,当我在 C++ 中触摸这些按钮时,它可以检测并显示这些按钮的“代码”,任何人都可以帮助我,我不知道从哪里开始?请 !!!
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?如果可能的话,我该如何解决这个问题?