我正在尝试制作Snake游戏,即普通的老式游戏,但我在使用键绑定方面遇到了一些困难。
我创建了我的Gui类的实例,它生成了JFrame,JPanel和JPanel数组。在这个实例之后,我喜欢使用while循环来检查玩家是否还活着,如果玩家是,则蛇每隔约1/4秒移动一个正方形,具体取决于难度。
当不在while循环中时,我可以正确使用键绑定,但当我让我的程序进入循环时,它无法识别我使用我的按钮。
也许这是Java中的标准事物,我不知道。如果是的话,有人可以告诉我应该如何处理我的问题吗?
InputMap im = base.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = base.getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Right");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Up");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Down");
am.put("Right", new ArrowAction("Right"));
am.put("Left", new ArrowAction("Left"));
am.put("Up", new ArrowAction("Up"));
am.put("Down", new ArrowAction("Down"));
上课:
public class ArrowAction extends AbstractAction {
String txt;
public ArrowAction(String txt) {
this.txt = txt;
}
public void actionPerformed(ActionEvent e) {
if (txt.equalsIgnoreCase("Left")) {
System.out.println("The left arrow was pressed!");
keyPressed = 0;
} else if (txt.equalsIgnoreCase("Right")) {
System.out.println("The right arrow was pressed!");
keyPressed = 1;
} else if (txt.equalsIgnoreCase("Up")) {
System.out.println("The up arrow was pressed!");
keyPressed = 2;
} else if (txt.equalsIgnoreCase("Down")) {
keyPressed = 3;
System.out.println("The down arrow was pressed!");
}
}
}
只是一个普通的while循环:
while (alive == true) {
// Some stuff happening, not relevant
}
那么为什么我的键绑定在循环中不起作用,但是在它之外工作呢?
答案 0 :(得分:0)
你的问题出在'一般的循环'中。这不是GUI应用程序的工作方式。在所有GUI应用程序(包括Java Swing)中,框架运行循环并向您发送要响应的事件。你写的一切都需要回应一个事件。如果它是一个应该一直运行的后台任务,那么它需要在自己的线程上 - 但我怀疑你的游戏需要它。
因此,删除你的一般while循环,并在自己的线程中或者(更有可能)定期发生'some stuff'以响应计时器。