使用鼠标光标移动对象-Java

使用鼠标光标移动对象-Java,java,performance,swing,graphics2d,Java,Performance,Swing,Graphics2d,我必须使用Java的面向对象编程来完成Agario游戏。到目前为止,我已经画了一个圆,我能够使它跟随我的光标。但是我有很多错误,比如光标碰到球后球没有跟随光标,有时球移动得很快,有时球移动得很慢 总的来说,我认为这还远远不够完美,我想提出一些建议。我只是要让它跟随,我有点挣扎。代码如下: 窗口类: public class window extends JFrame implements Runnable { Ball b = new Ball(); Thread t = new Th

我必须使用Java的面向对象编程来完成Agario游戏。到目前为止,我已经画了一个圆,我能够使它跟随我的光标。但是我有很多错误,比如光标碰到球后球没有跟随光标,有时球移动得很快,有时球移动得很慢

总的来说,我认为这还远远不够完美,我想提出一些建议。我只是要让它跟随,我有点挣扎。代码如下:

窗口类:

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

以下是球类课程:

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

  • 不需要线。您不应该使用无限while循环。去掉那个密码

  • formMouseMoved(…)
    moved方法中,您调用了repaint(),这将导致组件自行绘制

  • 另外,在你的球类课程中去掉线和while环


  • 关键是Swing是事件驱动的。
    mouseMoved(…)
    事件就是动画所需的全部内容。每次拖动鼠标时,将生成一个事件,该事件将导致您重新绘制球

    Stackoverflow更适合处理特定问题的问题。您的问题和征求建议的措辞太宽泛了。@k0pernikus我已经在codereview.stackexchange.com上发布了我的问题。谢谢你花时间回答我的问题。关于我的问题,我想不出更好的代码来跟踪我的光标:(@ricardore绝对不是关于代码审查的话题。我们不修复代码。关于球如何不跟随你的光标的问题在这里是有效的!只需更简洁地表述这个问题,并且毫不犹豫地针对不同的问题提出多个问题,即使它们有相似的代码基础。进一步的参考阅读:Unli似乎在神奇宝贝的前几个区域中的每个NPC,在CR我们不是Bug培训师,所以这个问题不适合迁移或x-PostingTanks回答。我将删除线程!每次我使用图形而不重新绘制时,最小化和最大化的应用程序将使绘图消失,我将遵循您的建议手势。谢谢
    每次我不用重新绘制就使用图形时,最小化和最大化的应用程序都会使绘图消失
    。我建议您从上的Swing教程中的工作示例开始。它将向您展示一种更好的绘制方法。也就是说,您应该扩展`paintComponent(…),然后将面板添加到框架中。该示例仅在每次单击时更改位置,因此我建议您首先更改示例以更改mouseMove()上的位置。