Изометрическая логика игровой мыши и движение вокруг окружающей среды

Я создаю изометрическую игровую среду, и я хочу перемещаться по окружающей среде, удерживая правую кнопку мыши и двигая мышь, чтобы просмотреть карту.

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

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class CameraMovementTest extends JPanel{

private Timer timer;
private int DELAY = 10;
private  CustomMouseListener mouseListener;
private int positionX = 0, positionY = 0;

public CameraMovementTest() {

    mouseListener  = new CustomMouseListener();
    this.addMouseListener(mouseListener);
    this.addMouseMotionListener(mouseListener);
    this.setSize(500,500);
    this.setVisible(true);

    //Swing Timer
    timer = new Timer(DELAY, new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
            update();
            repaint();
            validate(); 
        }
    }); 
    timer.start();
}

private void update() {
    if(mouseListener!=null){
        positionX = mouseListener.getX();
        positionY = mouseListener.getY();
    }
}

@Override
public void paint(Graphics g) {
    super.paint(g);
    g.fillRect( positionX,  positionY, 300,300);
}

public class CustomMouseListener implements MouseListener, MouseMotionListener {
    private int positionX = 0, positionY = 0;
    private int mouseClickX, mouseClickY;

    @Override
    public void mousePressed(MouseEvent evt) {

        if(SwingUtilities.isRightMouseButton(evt)) {

            mouseClickX = evt.getX();
            mouseClickY = evt.getY();
        }   
    }
    @Override
    public void mouseDragged(MouseEvent evt) {
        if(SwingUtilities.isRightMouseButton(evt)) {
            positionX = mouseClickX - evt.getX();
            positionY = mouseClickY - evt.getY();
        }
    }
    @Override
    public void mouseMoved(MouseEvent arg0) {}
    @Override
    public void mouseClicked(MouseEvent arg0) { }
    @Override
    public void mouseEntered(MouseEvent arg0) { }
    @Override
    public void mouseExited(MouseEvent arg0) {}

    @Override
    public void mouseReleased(MouseEvent arg0) {}
    public int getX(){
        return positionX;
    }
    public int getY(){
        return positionY;
    }
}


public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame f = new JFrame();
            f.setVisible(true);
            f.setSize(new Dimension(500,500));
            f.setContentPane(new CameraMovementTest());
        }
    });
}

}

1 ответ

Решение

он сбрасывает себя в исходное местоположение, прежде чем двигаться снова.

Вы добавили какой-либо код отладки, чтобы посмотреть на ваш расчет позиции х / у?

@Override
public void mousePressed(MouseEvent evt) {

    if(SwingUtilities.isRightMouseButton(evt)) {
        mouseClickX = evt.getX();
        mouseClickY = evt.getY();
    }
}

@Override
public void mouseDragged(MouseEvent evt) {
    if(SwingUtilities.isRightMouseButton(evt)) {
        System.out.println(mouseClickX + " : " + evt.getX());
        positionX = mouseClickX - evt.getX();
        positionY = mouseClickY - evt.getY();
    }
}

Вы устанавливаете mouseClickX/Y на точку мыши, затем в mouseDragged вычитаете точку мыши из значения. Это означает, что вы в основном получаете 0 (ну на самом деле 1, так как мышь переместилась на 1 пиксель для генерации события перетаскивания).

Таким образом, в логике mousePressed вы не можете просто сбросить mouseClickX/Y к текущей точке мыши. Вам также нужно отследить эту последнюю точку мыши:

@Override
public void mousePressed(MouseEvent evt) {

    if(SwingUtilities.isRightMouseButton(evt)) {
        //mouseClickX = evt.getX();
        //mouseClickY = evt.getY();
        mouseClickX = positionX + evt.getX();
        mouseClickY = positionY + evt.getY();
    }
}
Другие вопросы по тегам