2015-10-25 27 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为单位绘制的,当mouseDragged方法被调用并继续重绘时,我将鼠标移动到其x和y上。 ,你想看什么代码? –

回答

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个像素来产生拖动事件)。

所以在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(); 
    } 
} 
+0

非常感谢 –