2016-05-17 66 views
-1

我必須使用面向對象的Java編程來完成Agario遊戲。到目前爲止,我畫了一個圓圈,並且能夠使它跟隨我的光標。然而,我有許多錯誤,例如光標接觸到球后光標沒有跟隨光標,有時候,球快速移動,有時候會慢慢移動。使用鼠標光標移動對象 - Java

總的來說,我認爲這是遠遠不夠完美,並希望一些建議。我只需要遵循,我正在努力一點。下面的代碼:

窗口類:

public class window extends JFrame implements Runnable { 

    Ball b = new Ball(); 
    Thread t = new Thread(this); 

    public window() { 
    setSize(600, 600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(true); 
    setLocationRelativeTo(null); 
    setVisible(true); 
    t.start(); 

    addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
     public void mouseMoved(java.awt.event.MouseEvent evt) { 
      formMouseMoved(evt); 
     } 

    }); 

    } 

    private void formMouseMoved(MouseEvent evt) { 
    b.setnewtarget(evt.getX(), evt.getY()); 
    } 

    @Override 
    public void paint(Graphics g) { 
    super.paint(g); //To change body of generated methods, choose Tools | Templates. 
    b.drawCenteredCircle(g); 
    } 

    public static void main(String[] args) { 
    new window(); 
    } 

    @Override 
    public void run() { 
    while (true) { 
     repaint(); 
    } 
    } 

}

Here's球類:

public class Ball implements Runnable { 

    Thread t = new Thread(this); 
    int x, y, r; 
    int targetx, targety; 

    public Ball() { 
    x = 300; 
    y = 300; 
    r = 35; 
    t.start(); 
    } 

    public void drawCenteredCircle(Graphics g) { 
    g.fillOval(x, y, r, r); 
    g.drawLine(x, y, targetx, targety); 
    } 

    @Override 
    public void run() { 
    while (true) 

     int dx = Math.abs(targetx-x); 
     int dy = Math.abs(targety-x); 

     if (dx > dy) { 
      int oldx = x; 
      if (x > targetx) 
       x--; 
      else 
       x++; 

      y =((targety-y)/(targetx-x))*(x-oldx)+y; 
     } else { 
      int oldy = y; 
      if (y > targety) 
       y--; 
      else 
       y++; 

      x =((targetx-x)/(targety-y))*(y-oldy)+x; 
     } 

     try { 
      t.sleep(10); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Bola.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
    } 

    void setnewtarget(int x, int y) { 
    targetx = x; 
    targety = y; 
    } 
} 

感謝:d

+0

Stackoverflow更適合處理特定問題的問題。你的問題和徵求建議,正如它的措辭,太寬泛了。 – k0pernikus

+0

@ k0pernikus我已經在codereview.stackexchange.com上發佈我的問題。感謝您花時間回覆我的問題。關於我的問題,我只是想不出一個更好的代碼來跟蹤我的光標球:( –

+0

@RicardoReis絕對不是關於代碼評論的話題。我們不修復代碼。 – Riker

回答

2
  1. 沒有需要線程。你不應該使用無限循環。擺脫該代碼

  2. formMouseMoved(...)移動的方法你調用repaint()這將導致組件繪製自己。

  3. 另外,擺脫球類中的線程和while循環。

關鍵是Swing是事件驅動的。 mouseMoved(...)事件就是動畫所需的全部內容。每當您拖動鼠標時,都會生成一個事件,這會導致您重新繪製球。

+0

感謝您的回覆。我會刪除線程!每當我使用圖形而不重繪時,最小化和最大化的應用程序將使繪圖消失,我會按照您的建議。謝謝 –

+0

'每當我將使用圖形而不重繪,最小化和最大化時的應用程序將使繪圖消失。我建議你從[自定義繪畫](http://docs.oracle.com/javase/tutorial/uiswing/painting/step3.html)上的Swing教程中找到的工作示例開始。它會告訴你一個更好的繪畫方式。那就是你應該擴展一個JPanel的paintComponent(...)並繪製球體,然後將面板添加到框架中。該示例僅在每次單擊時更改位置,所以我建議您首先更改示例以更改mouseMove()的位置。 – camickr