用鼠标光标移动对象 - Java

时间:2016-05-17 13:51:30

标签: java performance swing graphics2d

我必须使用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();
    }
  }

}

这是Ball类:

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

1 个答案:

答案 0 :(得分:2)

  1. 不需要线程。你不应该使用无限循环。摆脱那段代码

  2. formMouseMoved(...)移动的方法中,您调用了repaint(),这将导致组件自行绘制。

  3. 另外,摆脱Ball类中的Thread和while循环。

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