Я немного новичок в использовании свинга и сочетаний клавиш, но я хотел попытаться сделать простой платформер, в котором игрок (в данном случае овал) можно перемещать с помощью 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, это мое предположение.
Теперь я хотел бы знать, знает ли кто-нибудь, как это исправить, с этим, я имею в виду, двигаться вправильное направление при первом нажатии.
Заранее спасибо!