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