0

ゲームを作っていますが、コントロールを編集できるようにしたいと思います。まあ、私はその部分をダウンさせましたが、それらは.txtファイルで読み取られて変更されています。それは私が今のところそれが機能することを望んでいた方法です。値はキー値として保存されます(つまり、KeyEvent.VK_Wは83に等しいため、行の値は83です)。また、値を読み取り、コアクラスのString配列変数に保存します。キーのプッシュを処理するキーイベントクラスでは、配列を参照してコマンドキーがプッシュされたかどうかを確認します。私は継続的にこのエラーを受け取ります:case expressions must be constant expressions私がそれを試してみると。これが間違ったコードです:

switch(key){
  case Integer.parseInt(commands[1]):
      ...
      break;
}

そして私はそのエラーを受け取ります。の値commands[1]は83です。これは「W」の値です。これが私の変数の宣言です:

for (int i = 0; i < commands.length; i++) {
                commands[i] = io.readSpecificLine(FILES.controlsFileFinalDir,
                        i + 1);
}

そして、すべての値を印刷してもらうと、機能します。アレイを作成しようとしましたfinalが、うまくいきませんでした。私は約2年前に以前にソリューションに出くわしましたが、再びそれを見つけることができません。誰かがこれを修正する方法について何かアイデアがありますか?前もって感謝します!

4

2 に答える 2

4

コンパイラが言うように、case式は定数式でなければなりません。配列要素を大文字小文字の表現として使用することはできません。代わりに//句をif使用else ifするだけです。else

于 2013-01-01T16:54:52.123 に答える
1

caseステートメントで非定数式を使用することはできません。別のアプローチは、値からアクションへのマップを作成することです。したがって、これの代わりに(これは実際には私には意味がありません):

switch (key) {
case Integer.parseInt(commands[1]):
    // action 1
    break;
// other cases...
default: 
    // default action
}

あなたはこのようなことをすることができます:

static Map<Integer, Runnable> keyMap = new HashMap<Integer, Runnable>();
static {
    keyMap.put(83, new Runnable() {
        @Override
        public void run() {
            // actions for code 83
        }
    });
    . . .
}

(より理にかなっている場合は、静的マップとしてではなく、インスタンスごとに実行することもできます。)その後:

Runnable action = keyMap.get(Integer.parseInt(commands[1]));
if (action != null) {
    action.run();
} else {
    // default action
}

アクションに変数を渡す必要がある場合はRunnable、アクションに使用する代わりに、独自のインターフェースを定義できます。

于 2013-01-01T17:00:35.673 に答える