KeyBindings.swing не обновляет значение при первом нажатии - PullRequest
0 голосов
/ 24 декабря 2018

Я немного новичок в использовании свинга и сочетаний клавиш, но я хотел попытаться сделать простой платформер, в котором игрок (в данном случае овал) можно перемещать с помощью WASD-клавиш.Я видел, что для этого предпочтительнее связывание клавиш.

Проблема сейчас в том, что я не могу заставить объект двигаться в правильном направлении при первом нажатии клавиши.

Вот мойкод, включая сочетания клавиш и действия:

class Player extends JPanel {
    private int x = 100;
    private int y = 100;
    private int velX = 0;
    private int velY = 0;

    private boolean left, right, up, down = true;


    public Player() {
        new Timer(10, taskPerformer).start();

        keyBindings();
        repaint();
    }

    public void paint(Graphics g) {
        super.paintComponent(g);

        setBackground(Color.black);
        g.setColor(Color.MAGENTA);
        g.fillOval(x, y, 10, 5);
    }

    ActionListener taskPerformer = evt -> {
        x = x + velX;
        y = y + velY;
        repaint();
    };

    //KEYBINDINGS
    public void keyBindings() {
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), "startMoving");
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released A"), "stopMoving");
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("D"), "startMoving");
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released D"), "stopMoving");
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("W"), "startMoving");
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released W"), "stopMoving");
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "startMoving");
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released S"), "stopMoving");

        this.getActionMap().put("startMoving", Move);
        this.getActionMap().put("stopMoving", stopMove);
    }


    //ACTIONS
    Action Move = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            if(e.getActionCommand().equals("a")) {
                if (left) {
                    left = false;
                    velX--;
                }
            } else if (e.getActionCommand().equals("d")) {
                if (right) {
                    velX++;
                    right = false;
                }
            } else if (e.getActionCommand().equals("w")) {
                if (up) {
                    velY--;
                    up = false;
                }
            } else if (e.getActionCommand().equals("s")) {
                if (down) {
                    down = false;
                    velY++;
                }
            }
        }
    };

    Action stopMove = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
                if (e.getActionCommand().equals("a")) {
                    System.out.println(left);
                    left = true;
                    velX++;
                } else if (e.getActionCommand().equals("d")) {
                    right = true;
                    velX--;
                } else if (e.getActionCommand().equals("w")) {
                    up = true;
                    velY++;
                } else if (e.getActionCommand().equals("s")) {
                    down = true;
                    velY--;
                }
        }
    };

}

«Игра» начинается с овала на экране, но когда я нажимаю кнопку (например, A), овал вообще не двигается.Затем, когда я отпускаю кнопку, овал начинает двигаться в другую сторону.Когда я нажимаю противоположную кнопку (так что после A второе нажатие кнопки будет D) и отпускаю ее, овал останавливается, и я могу правильно перемещать его в обоих направлениях.Затем то же самое происходит для W и S, так как они используют velY вместо velX, это мое предположение.

Теперь я хотел бы знать, знает ли кто-нибудь, как это исправить, с этим, я имею в виду, двигаться вправильное направление при первом нажатии.

Заранее спасибо!

...