3

Javajinputライブラリを使用してジョイパッドからデータを読み取っていますが、リロード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[]{});
}

これは正常に動作しますが、コントローラーを切断すると、これを呼び出すと再び見つかります。その逆も同様です (最初のチェックの後に接続すると、まったく見つかりません)。

これらの結果で、最初のルックアップの前にスリープを入れようとしました:

  1. コントローラーは、このメソッドが最初に呼び出されたときに (プログラムの開始時ではなく) 実際にスキャンされます。
  2. 再度呼び出されると、これは常に最初に返されたものと同じコントローラーを返します。
  3. 最初の呼び出しでも以下の警告が書き込まれます
  4. コントローラーが接続されている (そして動作している) 場合でも、切断され (それでも検出されます)、再接続されても動作しません。

ポイント 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 回目、というようにコントローラーを実際にリロードするにはどうすればよいですか?

4

4 に答える 4

7

同じ問題が発生しました。これは、実際のハードウェア スキャンが DefaultControllerEnvironment オブジェクトごとに 1 回だけ行われるためです。アクセス可能な唯一のインスタンス化はシングルトンであるため、別のスキャンを実行することはありません。

ハードウェア スキャンを強制する簡単な方法は、新しいオブジェクトを作成することですが、クラスもコンストラクターもパブリックではありません。ただし、リフレクションを介してコンストラクターを呼び出すことで、この制限を回避できます。

再スキャン

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;
        }
    });

}
于 2014-04-25T18:27:09.943 に答える
1

以前も同じ問題がありました。再スキャン機能 (Windows バックエンドのみ) を追加し、パッチを Java ゲーム フォーラムに投稿しましたが、誰も統合に関心を持っていないようです。

必要な場合は、ここからパッチを適用してください: http://www.java-gaming.org/topics/rescan-controllers/24782/msg/224604/view.html#msg224604

于 2013-12-14T21:58:26.440 に答える