簡體   English   中英

使用鼠標光標移動對象-Java

[英]Move object with mouse cursor - Java

我必須使用面向對象的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. 不需要線程。 您不應該使用無限的while循環。 擺脫那個代碼

  2. formMouseMoved(...)移動的方法中,您調用了repaint(),這將導致組件自行繪制。

  3. 另外,在Ball類中擺脫Thread和while循環。

關鍵是Swing是事件驅動的。 動畫只需要mouseMoved(...)事件。 每次拖動鼠標時,都會生成一個事件,使您重新繪制Ball。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM