2015-10-25 28 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

非常感謝 –