2016-05-17 67 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