Java在按键后是否立即继续移动?
当我按下任何键箭头时,红色框移动,是的,移动10px,然后停止1秒&继续移动,而不是不停地立即移动 发生问题的示例:Java在按键后是否立即继续移动?,java,swing,keyboard,Java,Swing,Keyboard,当我按下任何键箭头时,红色框移动,是的,移动10px,然后停止1秒&继续移动,而不是不停地立即移动 发生问题的示例: (来源:) 你能看到它是如何停止1秒或0.5秒并继续的吗 我怎样才能修好它 我正在使用KeyEventDispatcher 我的钥匙检测: 整个src: public class Game extends Frame { private class Keyboard implements KeyEventDispatcher { private Ga
(来源:) 你能看到它是如何停止1秒或0.5秒并继续的吗 我怎样才能修好它 我正在使用
KeyEventDispatcher
我的钥匙检测:
整个src:
public class Game extends Frame {
private class Keyboard implements KeyEventDispatcher {
private Game game;
public Keyboard(Game game) {
this.game = game;
}
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
this.movement(e);
} else if (e.getID() == KeyEvent.KEY_RELEASED) {
} else if (e.getID() == KeyEvent.KEY_TYPED) {
}
return false;
}
public void movement(KeyEvent e) {
int keyCode = e.getKeyCode();
switch( keyCode ) {
case KeyEvent.VK_UP:
game.movePlayer(0, -10);
break;
case KeyEvent.VK_DOWN:
game.movePlayer(0, 10);
break;
case KeyEvent.VK_LEFT:
game.movePlayer(-10, 0);
break;
case KeyEvent.VK_RIGHT :
game.movePlayer(10, 0);
break;
}
}
}
private static final long serialVersionUID = 1L;
private int coordinateX = 1;
private int coordinateY = 1;
public int width = 300;
public int height = width / 16 * 9;
public int scale = 3;
public int mouseY = MouseInfo.getPointerInfo().getLocation().y;
public int mouseX = MouseInfo.getPointerInfo().getLocation().x;
private Player player = new Player(0, 0);
public Game() {
Dimension size = new Dimension(width * scale, height * scale);
setPreferredSize(size);
frame.setSize(width, height);
frame.setResizable(false);
frame.setTitle("First game");
JPanel j = new JPanel();
j.setVisible(true);
JLabel text = new JLabel("coords");
j.add(text);
frame.add(this);
frame.pack();
frame.add(j);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new Keyboard(this));
}
private void movePlayer(int x, int y) {
/**
* Main region area
*/
int pX = 0, pY = 0;
if (y == 0) { // x
if (player.getX() + x + 100 > frame.getContentPane().getWidth() || player.getX() + x < 0) {
if (player.getX() + x < 0) {
player.setX(0);
return;
}
if (player.getX() + x > 0) {
player.setX(frame.getContentPane().getWidth() - 100);
return;
}
return;
}
pX = x;
}
else if (x == 0) { // y
if (player.getY() + y + 100 > frame.getContentPane().getHeight() || player.getY() + y < 0) {
if (player.getY() + y < 0) {
player.setY(0);
return;
}
if (player.getY() + y > 0) {
player.setY(frame.getContentPane().getHeight() - 100);
return;
}
return;
}
pY = y;
}
player.updatePosition(pX, pY);
}
public void update() {
}
public void render() {
bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
g = bs.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.RED);
g.fillRect(player.getX(), player.getY(), 100, 100);
g.dispose();
bs.show();
}
}
问题在于击键的重复率。这是由操作系统控制的 解决方案是在按下该键后立即使用摆动计时器来安排动画 有关更多信息和完整的工作示例,请参见
另外,您不应该使用KeyListener,但intead应该使用KeyBinding。我认为问题不在您提供的代码范围之内。构建SSCCE将为您解决问题,或者为其他人提供他们需要的信息。@jzd信息,比如什么?我真的不知道是什么代码导致了这个问题,但我很确定这是我为自己的需要所做的错误的关键事件。没有SSCCE,很难诊断问题。更新延迟指向的不是KeyEvent处理。
public class Frame extends Canvas {
public static final long serialVersionUID = 8L;
public static JFrame frame = new JFrame();
public static Threads thread;
public static Game game;
public Graphics g;
public BufferStrategy bs;
/**
* @param args
*/
public static void main(String[] args) {
thread = new Threads(new Game());
thread.start();
}
}