gpt4 book ai didi

Java 按下按键后立即继续运动?

转载 作者:行者123 更新时间:2023-11-30 04:05:53 25 4
gpt4 key购买 nike

好吧,当我按下任意键箭头时,红色框会移动,是的,它移动 10px,然后停止 1 秒并继续移动,而不是立即移动而不停止。

发生问题的示例:

img
(来源:gyazo.com)

你能看到它是如何停止 1 或 0.5 秒然后继续的吗?

如何修复它?

我正在使用KeyEventDispatcher

我的按键检测:

整个源代码:

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();
}

}

框架.java:

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();
}
}

最佳答案

问题在于 KeyStrokes 的重复率。这是由操作系统控制的。

解决方案是使用 Swing Timer 在按下按键后立即安排动画。

参见Motion Using the Keyboard了解更多信息和完整的工作示例。

此外,您不应该使用 KeyListener,而应该使用 KeyBindings。

关于Java 按下按键后立即继续运动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20734592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com