Java Наручники заикаются при освобождении - PullRequest
0 голосов
/ 06 мая 2020

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

    }

}

Спасибо!

...