-1

Java ゲームの動的キーバインド システムを作成しようとしています。ab、などの文字がc機能しないという 1 つの大きな問題を除いて、ほとんどの場合機能します。~&、などの文字のみが機能し$ます。

でメソッドを呼び出しますKeyFinder lookup = KeyFinder.lookup(keyChar);

これが私の現在のコードファイルです。これが本当に長い場合は申し訳ありません。

KeyFinder.java

public enum KeyFinder {
    A(Keyboard.KEY_A, "a", "A"),
    B(Keyboard.KEY_B, "b", "B"),
    C(Keyboard.KEY_C, "c", "C"),
    D(Keyboard.KEY_D, "d", "D"),
    E(Keyboard.KEY_E, "e", "E"),
    F(Keyboard.KEY_F, "f", "F"),
    G(Keyboard.KEY_G, "g", "G"),
    H(Keyboard.KEY_H, "h", "H"),
    I(Keyboard.KEY_I, "i", "I"),
    J(Keyboard.KEY_J, "j", "J"),
    K(Keyboard.KEY_K, "k", "K"),
    L(Keyboard.KEY_L, "l", "L"),
    M(Keyboard.KEY_M, "m", "M"),
    N(Keyboard.KEY_N, "n", "N"),
    O(Keyboard.KEY_O, "o", "O"),
    P(Keyboard.KEY_P, "p", "P"),
    Q(Keyboard.KEY_Q, "q", "Q"),
    R(Keyboard.KEY_R, "r", "R"),
    S(Keyboard.KEY_S, "s", "S"),
    T(Keyboard.KEY_T, "t", "T"),
    U(Keyboard.KEY_U, "u", "U"),
    V(Keyboard.KEY_V, "v", "V"),
    W(Keyboard.KEY_W, "w", "W"),
    X(Keyboard.KEY_X, "x", "X"),
    Y(Keyboard.KEY_Y, "y", "Y"),
    Z(Keyboard.KEY_Z, "z", "Z"),
    TILDE(Keyboard.KEY_GRAVE, "~", "`"),
    TAB(Keyboard.KEY_TAB, "tab"),
    F1(Keyboard.KEY_F1, "F1"),
    F2(Keyboard.KEY_F2, "F2"),
    F3(Keyboard.KEY_F3, "F3"),
    F4(Keyboard.KEY_F4, "F4"),
    F5(Keyboard.KEY_F5, "F5"),
    F6(Keyboard.KEY_F6, "F6"),
    F7(Keyboard.KEY_F7, "F7"),
    F8(Keyboard.KEY_F8, "F8"),
    F9(Keyboard.KEY_F9, "F9"),
    F10(Keyboard.KEY_F10, "F10"),
    F11(Keyboard.KEY_F11, "F11"),
    F12(Keyboard.KEY_F12, "F12"),
    F13(Keyboard.KEY_F13, "F13"),
    F14(Keyboard.KEY_F14, "F14"),
    F15(Keyboard.KEY_F15, "F15"),
    ONE(Keyboard.KEY_1, "1", "!", "one"),
    TWO(Keyboard.KEY_2, "2", "@", "two"),
    THREE(Keyboard.KEY_3, "3", "#", "three"),
    FOUR(Keyboard.KEY_4, "4", "$", "four"),
    FIVE(Keyboard.KEY_5, "5", "%", "five"),
    SIX(Keyboard.KEY_6, "6", "^", "six"),
    SEVEN(Keyboard.KEY_7, "7", "&", "seven"),
    EIGHT(Keyboard.KEY_8, "8", "*", "eight"),
    NINE(Keyboard.KEY_9, "9", "(", "nine"),
    ZERO(Keyboard.KEY_0, "0", ")", "zero"),
    MINUS(Keyboard.KEY_MINUS, "-", "_", "minus"),
    EQUALS_ADD(Keyboard.KEY_EQUALS, "=", "+", "plus", "equals"),
    INSERT(Keyboard.KEY_INSERT, "insert", "ins"),
    DEL(Keyboard.KEY_DELETE, "del", "delete"),
    HOME(Keyboard.KEY_HOME, "home"),
    ADD(Keyboard.KEY_ADD, "add"),
    PAGE_UP(Keyboard.KEY_PRIOR, "prior", "pageup"),
    PAGE_DOWN(Keyboard.KEY_NEXT, "next", "pagedown"),
    NUM_LOCK(Keyboard.KEY_NUMLOCK, "numlock", "numberlock"),
    SQBRACKET_LEFT(Keyboard.KEY_LBRACKET, "[", "{"),
    SQBRACKET_RIGHT(Keyboard.KEY_RBRACKET, "]", "}"),
    SEMICOLON(Keyboard.KEY_SEMICOLON, ";", ":");
    private static final Map<Integer, KeyFinder> keys = new HashMap<Integer, KeyFinder>();
    private static final Map<String, KeyFinder> lookup = new LinkedHashMap<String, KeyFinder>();
    private final int key;
    private final String keyName;
    private final String[] lookupKeys;
    static {
        for (KeyFinder type : EnumSet.allOf(KeyFinder.class)) {
            keys.put(type.key, type);
            for (String key : type.lookupKeys) {
                lookup.put(key, type);
            }
        }
    }

    KeyFinder(int key, String keyName, String lookupKey) {
        this.key = key;
        this.keyName = keyName;
        this.lookupKeys = new String[] { lookupKey };
    }

    KeyFinder(int key, String keyName, String... lookupKeys) {
        this.key = key;
        this.keyName = keyName;
        this.lookupKeys = lookupKeys;
    }

    public static KeyFinder fromKey(int key) {
        return keys.get(key);
    }

    public static String toKeyName(int key) {
        KeyFinder type = keys.get(key);
        if (type != null) {
            return type.getKeyName();
        } else {
            return "#" + key;
        }
    }

    public static KeyFinder lookup(String keyName) {
        return lookup(keyName, true);
    }

    public static KeyFinder lookup(String keyName, boolean fuzzy) {
        KeyFinder i = StringUtil.lookup(lookup, keyName, fuzzy);
        if(i != null)
            return i;
        else
            try {
                return fromKey(Integer.parseInt(keyName));
            } catch (NumberFormatException e) {
                return null;
            }
    }

    public int getKey() {
        return key;
    }

    public String getKeyName() {
        return keyName;
    }
}
4

3 に答える 3

3

私はあなたを取り除き、KeyFinderと一緒にテストしましたが、マップStringUtilで を決して使用しないことに気付きました。そうではありません。keyNamelookupa

ここに私が行ったいくつかの変更があります。

lookupKeysを配列ではなくリストに変更します。

private final ArrayList<String> lookupKeys = new ArrayList<String>();

コンストラクターの1つを削除します( を使用しているため、廃止されましたvarargs

KeyFinder(int key, String keyName, String lookupKey) // Remove

他のコンストラクターを変更してkeyNamelookupKeys.

KeyFinder(int key, String keyName, String... lookupKeys) {
    this.key = key;
    this.keyName = keyName;
    this.lookupKeys.add(keyName);
    this.lookupKeys.addAll(Arrays.asList(lookupKeys));
}

いくつかの簡単なテストでうまくいきました。

注意

私はあなたのコードをこれ以上分析していません。本当に必要かどうかはわかりませんが、おkeyName任せします。ルックアップを機能させたかっただけです。

于 2012-08-15T11:22:24.487 に答える
2

問題は、コードが複雑すぎるため(=依存関係が多すぎるため)、問題を減らすことができないことです。

コードを独立したビットとピースに分割し、それぞれの単体テストを記述してみてください。単体テストが機能する場合、バグはさまざまな部分を接続するコードにのみ隠れることができることがわかります。

そうは言っても、私の推測では、いくつかのメソッドが返さnullれ、この場合は黙って失敗するコードを記述しました(つまり、「ここではnullを返さないでください」というエラーメッセージを表示する代わりに、あきらめるだけです)。このようなコードは、異常な状態が発生すると、何が起こっているのかを理解しようとしている人(この場合はあなた)にとって何の手がかりもなく、黙って失敗するだけなので、非常に不親切です。

于 2012-08-15T10:32:32.297 に答える
2

コードを削除できないというのは間違っています。削除した場合は、エラーを自分で見つけたはずです。

これは、失敗したルックアップの核心を示すイデオン スニペットです。最初のキー文字はルックアップ マップに表示されないことに注意してください。これは であり、keyNameではないためlookupKeyです。

名前が検索キーとしても表示される変更されたスニペットを次に示します。当然のことながら、ルックアップは成功します。

実際、keyNameフィールドは使用されないため無意味に思えます (toString()列挙型定数の「名前」を取得する方が適切です)。したがって、このバリアントはおそらくより良いものです。


あなたの問題は、文字と記号とは何の関係もありませんでした。単純に、最初に引用された記号が機能しないということでした (そのため、大文字のルックアップが機能していたはずです)。同様に、コードがどのように機能するかを 99% 理解する必要はありませんでした。それは単に、静的マップの入力が間違っているという問題でした。

今後は迷わず積極的に行動してください。

于 2012-08-15T11:32:05.123 に答える