[英]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
不需要線程。 您不應該使用無限的while循環。 擺脫那個代碼
在formMouseMoved(...)
移動的方法中,您調用了repaint(),這將導致組件自行繪制。
另外,在Ball類中擺脫Thread和while循環。
關鍵是Swing是事件驅動的。 動畫只需要mouseMoved(...)
事件。 每次拖動鼠標時,都會生成一個事件,使您重新繪制Ball。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.