我正在开发一款带键盘输入的游戏,很多时候你需要同时按下几个键。例如,你想要按住空间进行射击,向上按箭头,向左或向右箭头进行转动。但是,箭头键的行为非常奇怪。大多数情况下,按键方法无法识别按下的第三个箭头键,有时甚至更奇怪:如果其他键被保持,它将检测到错误的键。我明白这很令人困惑所以我制作了一个程序来展示它:
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
}
}
以下是与该计划有关的一些事项,以表明我的意思: - 保持空间,向上箭头,然后尝试按向左或向右箭头。 (该程序只显示数组键,因为这是奇怪的) - 在它们之间留出一点时间,按住空格,向上箭头和向右箭头,向上和向右显示,然后当你的手指离开右箭头时,按住向左箭头。如果它不仅仅是我的键盘,它将保持为按下右箭头。
所以有人知道是什么原因引起的吗?它只是我的键盘吗?尝试使用游戏玩法真的很令人沮丧。
提前致谢。
答案 0 :(得分:2)
请改用这些库 http://ksquared.de/blog/releases/stable/keyboard_hook-0.3.zip 这些都有正确的箭头键映射,可以有效地检测多个按键,虽然JNativeHook远远好于此。