按键后Java立即继续运行?

时间:2013-12-22 22:12:25

标签: java swing keyboard

当我按下任何一个关键箭头时,红色框移动,是的它移动10px然后停止1秒&继续移动,而不是立即移动而不停止。

发生问题的示例:

img http://gyazo.com/02a1e8dc9903187f075d07101358e61e.gif

你能看到它停止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();
    }   

}

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

1 个答案:

答案 0 :(得分:2)

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

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

有关详细信息和完整的工作示例,请参阅Motion Using the Keyboard

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