2015-10-25 6 views
1

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

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

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()); 
     } 
    }); 
} 

}

+0

Был ли этот вопрос одним из тех, что лучше было бы задать на GameDev.SE? – Arc676

+0

@ Arc676: нет, я думаю, что этот сайт является подходящим сайтом для этого вопроса, но я боюсь, что для того, чтобы ответить на него, нам понадобится дополнительная информация и рабочий код, желательно [mcve]. –

+0

На самом деле не так много кода, фон нарисован на 0,0 в целом, и я добавляю движение мыши к своим x и y, когда вызывается метод mouseDragged и продолжает перерисовывать. , какой код вы хотели бы видеть? –

ответ

2

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

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

@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 пиксель для генерации события перетаскивания).

Таким образом, в мышиной логике вы не можете просто сбросить 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(); 
    } 
} 
+0

Большое спасибо –