我正在开发一种带键盘输入的游戏,很多时候你需要同时按下几个键 . 例如,你想要按住空间进行射击,向上按箭头,向左或向右箭头转动 . 但是,箭头键的行为非常奇怪 . 大多数情况下,按键方法无法识别按下的第三个箭头键,有时甚至更奇怪:如果其他键被保持,它将检测到错误的键 . 我明白这很令人困惑所以我制作了一个程序来展示它:
package resources;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
public class Keys extends JPanel implements ActionListener, KeyListener {
Timer t = new Timer(5, this);
ArrayList<String> keyspressed;
public Keys() {
JFrame f = new JFrame();
f.setSize(350, 100);
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
f.add(this);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
t.start();
keyspressed = new ArrayList<String>();
}
public void actionPerformed(ActionEvent e) {
repaint(); System.out.println(keyspressed);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(showKeysPressed(), 20, 20);
}
public String showKeysPressed() {
String s = "Currently pressed keys: ";
for(int i = 0; i < keyspressed.size(); i++) {
s+= keyspressed.get(i) + " ";
}
return s;
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP && !keyspressed.contains("Up"))
keyspressed.add("Up");
if(e.getKeyCode() == KeyEvent.VK_RIGHT && !keyspressed.contains("Right"))
keyspressed.add("Right");
if(e.getKeyCode() == KeyEvent.VK_LEFT && !keyspressed.contains("Left"))
keyspressed.add("Left");
if(e.getKeyCode() == KeyEvent.VK_DOWN && !keyspressed.contains("Down"))
keyspressed.add("Down");
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP)
keyspressed.remove("Up");
if(e.getKeyCode() == KeyEvent.VK_RIGHT)
keyspressed.remove("Right");
if(e.getKeyCode() == KeyEvent.VK_LEFT)
keyspressed.remove("Left");
if(e.getKeyCode() == KeyEvent.VK_DOWN)
keyspressed.remove("Down");
}
public static void main(String[] args) {
new Keys();
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
以下是与该程序有关的一些事项,以显示我的意思: - 空间,向上箭头,然后尝试按向左或向右箭头 . (程序只显示数组键,因为这是奇怪的) - 中间有一点时间,保持空间,向上箭头和向右箭头所以向上和向右显示,然后当你把手指从向右箭头,按住左箭头 . 如果它不仅仅是我的键盘,它将保持按下右箭头 .
那么有谁知道是什么导致了这个?它只是我的键盘吗?尝试使用游戏玩法是非常令人沮丧的 .
提前致谢 .
1 回答
使用这些库而不是http://ksquared.de/blog/releases/stable/keyboard_hook-0.3.zip这些具有正确的箭头键映射,并且可以有效地检测多个按键,虽然JNativeHook远比这更好 .