gpt4 book ai didi

Java Jinput : rescan/reload controllers

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:59 37 4
gpt4 key购买 nike

我正在使用 java jinput 库从游戏 handle 读取数据,但我无法重新加载 Controllers,我用它来加载它们:

public Controller[] findStickControllers() {
ControllerEnvironment ce =
ControllerEnvironment.getDefaultEnvironment();

Controller[] cs = ce.getControllers();

System.out.println(cs.length); //test

ArrayList<Controller> sel = new ArrayList<>();

for (Controller c: cs) {
if(c.getType() == Type.STICK) {
sel.add(c);
}
}

return sel.toArray(new Controller[]{});
}

这工作正常,但如果我断开我的 Controller ,调用它会再次找到它,反之亦然(在第一次检查后连接它根本找不到它)。

我试着在第一次查找之前先 sleep ,结果如下:

  1. 第一次调用此方法时会自动扫描 Controller (不是在程序开始时)
  2. 再次调用时,它总是返回与第一次相同的 Controller 。
  3. 第一次调用也会在下面写警告
  4. 即使 Controller 已连接(并工作),然后断开连接(但仍会找到它)并重新连接,它也不会工作

第 3 点的警告:(列表中的格式不正确)

WARNING: Found unknown Windows version: Windows 8
Attempting to use default windows plug-in.
Loading: net.java.games.input.DirectAndRawInputEnvironmentPlugin

我使用的是 Win 8,在 Win 7 上也有同样的问题。我也用鼠标尝试过,结果相同。

如何在第 2、3 次等时间准确地重新加载 Controller ?

最佳答案

我遇到了同样的问题。原因是实际的硬件扫描对于每个 DefaultControllerEnvironment 对象只发生一次。由于唯一可访问的实例化是单例,因此它永远不会进行另一次扫描。

强制硬件扫描的一种简单方法是创建一个新对象,但类和构造函数都不是公共(public)的。但是,您可以通过反射调用构造函数来解决此限制。

重新扫描

private static ControllerEnvironment createDefaultEnvironment() throws ReflectiveOperationException {

// Find constructor (class is package private, so we can't access it directly)
Constructor<ControllerEnvironment> constructor = (Constructor<ControllerEnvironment>)
Class.forName("net.java.games.input.DefaultControllerEnvironment").getDeclaredConstructors()[0];

// Constructor is package private, so we have to deactivate access control checks
constructor.setAccessible(true);

// Create object with default constructor
return constructor.newInstance();
}

用法

// Be aware that creating a new environment is fairly expensive
Controller[] controllers = createDefaultEnvironment().getControllers();

删除 Windows 8 警告

/**
* Fix windows 8 warnings by defining a working plugin
*/
static {

AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
String os = System.getProperty("os.name", "").trim();
if (os.startsWith("Windows 8")) { // 8, 8.1 etc.

// disable default plugin lookup
System.setProperty("jinput.useDefaultPlugin", "false");

// set to same as windows 7 (tested for windows 8 and 8.1)
System.setProperty("net.java.games.input.plugins", "net.java.games.input.DirectAndRawInputEnvironmentPlugin");

}
return null;
}
});

}

关于Java Jinput : rescan/reload controllers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17413690/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com