【发布时间】:2012-02-04 06:13:32
【问题描述】:
是键盘限制问题吗?
我在玩一些代码时遇到了问题。想象一个自上而下的太空射击游戏。我遇到的问题是,在我的电脑上,当我按住向上和向左箭头时,我无法射击(空格键)。任何其他方向(上、下、左、右、上 + 右、右 + 下、左 + 下)都有效。我让一个朋友在他的电脑上运行代码,他发现除了上+右和右+下之外的所有方向都可以正常工作,但上+左对他来说效果很好。我们都查看了代码,但无法弄清楚。这可能是硬件问题吗?
基本上,这就是我正在做的事情:
import javax.swing.*;
import java.awt.event.*;
public class Test extends JFrame
{
boolean up, down, left, right, fire;
// Main constructor
public Test()
{
// listeners for user input
this.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
switch (e.getKeyCode())
{
case KeyEvent.VK_UP:
{
up = true;
break;
}
case KeyEvent.VK_LEFT:
{
left = true;
break;
}
case KeyEvent.VK_RIGHT:
{
right = true;
break;
}
case KeyEvent.VK_DOWN:
{
down = true;
break;
}
case KeyEvent.VK_SPACE:
{
fire = true;
break;
}
case KeyEvent.VK_ESCAPE:
{
// Exit
System.exit(0);
}
}
}
public void keyReleased(KeyEvent e)
{
// Upon releasing key, stop direction
switch(e.getKeyCode())
{
case KeyEvent.VK_UP:
{
up = false;
break;
}
case KeyEvent.VK_LEFT:
{
left = false;
break;
}
case KeyEvent.VK_RIGHT:
{
right = false;
break;
}
case KeyEvent.VK_DOWN:
{
down = false;
break;
}
}
}
});
}
public static void main(String[] args)
{
// create frame
Test test = new Test();
test.setLocationRelativeTo(null);
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setVisible(true);
test.loop();
}
public void loop()
{
Timer timer = new Timer(250, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (up)
System.out.println("Moving UP.");
if (left)
System.out.println("Moving LEFT.");
if (right)
System.out.println("Moving RIGHT.");
if (down)
System.out.println("Moving DOWN.");
if (fire)
{
System.out.println("FIRING.");
fire = false;
}
}
});
timer.start();
}
}
这个问题最初被问到here。
【问题讨论】:
-
您的操作系统或 JVM 版本是否也存在差异?哪个键在哪个操作系统中触发略有不同。最好的事情可能是查看正在触发的关键事件(如果有的话)并从那里开始。此外,像 Slick2D 这样的库可以帮助您抽象出这些奇怪的事件。
标签: java keylistener