我有一个建立游戏的任务... 我希望用户在程序中输入他想要玩的键。 问题是Java要求switch case中的值为const ... 我的想法是为KeyListener创建一个类型继承,然后我将它添加到他的合适的播放器。
接收所需的密钥作为参数int[] keys
我已经看到有些人通过添加"静态最终"来提供类似问题的解决方案。不幸的是它没有帮助
这是我的代码:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class PlayerKeyListener implements KeyListener
{
int[] keys;
int playerID;
PlayerKeyListener(int[] keys, int playerID)
{
this.keys = keys;
this.playerID = playerID;
}
public void keyPressed(KeyEvent e)
{
System.out.println("keyPressed code : "+ e.getKeyCode());
switch (e.getKeyCode())
{
case keys[KeyboardSettings.UP]: gameBord.players[playerID].moveUp(); break;
case keys[KeyboardSettings.DOWN]: gameBord.players[playerID].moveDown(); break;
case keys[KeyboardSettings.LEFT]: gameBord.players[playerID].moveLeft(); break;
case keys[KeyboardSettings.RIGHT]: gameBord.players[playerID].moveRight(); break;
case keys[KeyboardSettings.BOMB]: gameBord.players[playerID].addBomb(); break;
default: gameBord.players[playerID].face = 0;
}
e.consume();
}
public void keyReleased(KeyEvent e)
{
System.out.println("keyReleased code : "+ e.getKeyCode());
gameBord.players[playerID].move = false;
gameBord.players[playerID].pic = 0;
e.consume();
}
public void keyTyped(KeyEvent e)
{
System.out.println("keyTyped code : "+ e.getKeyCode());
e.consume();
}
}
tnx;)
答案 0 :(得分:1)
案例表达式必须是常量表达式。
你在标题中回答了自己。您无法在case
关键字之后拥有变量。
switch
命令的工作方式是必须在编译时知道所有情况(case
关键字之后的值)。
switch (e.getKeyCode()) {
case constant1: commands;
case constant2: commands;
}
keys[KeyboardSettings.UP]
不是常数,而是变量。它的值在运行时已知。编译器不知道那里有什么价值并且正在大喊你:"嘿,user3142930,我需要知道case
关键字后面所有内容的价值!"
在您的情况下,您只是无法使用switch
。您应该使用一系列if-else
命令,如下所示:
// store it in a variable so you do not call the method repeatedly
final int code = e.getKeyCode();
// this is instead of your switch
if (code == keys[KeyboardSettings.UP]) {
....
}
else if (code == keys[KeyboardSettings.DOWN]) {
...
}
else if (...) {
...
}
它的深层原因是您希望用户可以配置密钥,因此您无法在编译时知道它们的值。
如果你不理解我的最后一句,你可以学习Runtime vs Compile time。