Я понимаю, что здесь уже есть похожие вопросы, но я не могу найти ту проблему, которая у меня возникла. В настоящее время я просто пытаюсь заставить зеленый квадрат перемещаться по панели и настроил для этого несколько привязок клавиш. У меня также есть флаги ( movingUp, movingDown, movingRight, movingLeft ), настроенные для установки с помощью действий привязки клавиш. Когда я удерживаю клавишу, квадрат перемещается нормально, но когда я нажимаю другую клавишу, чтобы изменить направление, а затем отпускаю исходную клавишу, блок останавливается и запускается снова. Ниже приведен код класса MainSprite, а затем действие, которое вызывается в привязках клавиш. Обновление в классе MainSprite вызывается в основном игровом движке l oop в моем основном классе и работает надежно, поэтому я не думаю, что это проблема. Класс рендеринга тот же; он просто отправляет квадрат на графику панели для визуализации, а затем рисования.
Класс MainSprite:
package sprites;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import javax.swing.KeyStroke;
import actions.MoveAction;
import main.Panel;
public class MainSprite {
int x = 0;
int y = 0;
int deltaX;
int deltaY;
boolean movingLeft, movingRight, movingUp, movingDown = false;
Panel panel;
public void init() {
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), "MOVE_UP_PRESSED");
panel.getActionMap().put("MOVE_UP_PRESSED", new MoveAction(this, "START_UP"));
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, true), "MOVE_UP_RELEASED");
panel.getActionMap().put("MOVE_UP_RELEASED", new MoveAction(this, "STOP_UP"));
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false), "MOVE_DOWN_PRESSED");
panel.getActionMap().put("MOVE_DOWN_PRESSED", new MoveAction(this, "START_DOWN"));
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, true), "MOVE_DOWN_RELEASED");
panel.getActionMap().put("MOVE_DOWN_RELEASED", new MoveAction(this, "STOP_DOWN"));
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "MOVE_RIGHT_PRESSED");
panel.getActionMap().put("MOVE_RIGHT_PRESSED", new MoveAction(this, "START_RIGHT"));
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "MOVE_RIGHT_RELEASED");
panel.getActionMap().put("MOVE_RIGHT_RELEASED", new MoveAction(this, "STOP_RIGHT"));
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "MOVE_LEFT_PRESSED");
panel.getActionMap().put("MOVE_LEFT_PRESSED", new MoveAction(this, "START_LEFT"));
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "MOVE_LEFT_RELEASED");
panel.getActionMap().put("MOVE_LEFT_RELEASED", new MoveAction(this, "STOP_LEFT"));
}
public void update() {
move();
}
public void render(Graphics2D g) {
g.setColor(Color.GREEN);
g.fillRect(x, y, 100, 100);
}
public void move() {
if(movingUp) { moveUp(); }
if(movingDown) { moveDown(); }
if(movingLeft) { moveLeft(); }
if(movingRight) { moveRight(); }
}
public void moveUp() { y = y - 5; }
public void moveDown() { y = y + 5; }
public void moveRight() { x = x + 5; }
public void moveLeft() { x = x - 5; }
public void movingLeft(boolean b) {
if(b != movingLeft) {
movingLeft = b;
}
}
public void movingRight(boolean b) {
if(b != movingRight) {
movingRight = b;
}
}
public void movingUp(boolean b) {
if(b != movingUp) {
movingUp = b;
}
}
public void movingDown(boolean b) {
if(b != movingDown) {
movingDown = b;
}
}
public void setPanel(Panel p) { panel = p; }
public void setX(int x2) { x = x2; }
public void setY(int y2) { y = y2; }
public int getX() { return x; }
public int getY() { return y; }
}
Класс MoveAction:
package actions;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import sprites.MainSprite;
public class MoveAction extends AbstractAction {
boolean movingUp;
boolean movingDown;
boolean movingRight;
boolean movingLeft;
MainSprite mainSprite;
public MoveAction(MainSprite main, String which) {
mainSprite = main;
if(which == "START_UP") {
movingUp = true;
}
if(which == "START_DOWN") {
movingDown = true;
}
if(which == "START_RIGHT") {
movingRight = true;
}
if(which == "START_LEFT") {
movingLeft = true;
}
if(which == "STOP_UP") {
movingUp = false;
}
if(which == "STOP_DOWN") {
movingDown = false;
}
if(which == "STOP_RIGHT") {
movingRight = false;
}
if(which == "STOP_LEFT") {
movingLeft = false;
}
}
public void actionPerformed(ActionEvent e) {
mainSprite.movingDown(movingDown);
mainSprite.movingLeft(movingLeft);
mainSprite.movingRight(movingRight);
mainSprite.movingUp(movingUp);
}
}
Спасибо!