我必须使用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
答案 0 :(得分:2)
不需要线程。你不应该使用无限循环。摆脱那段代码
在formMouseMoved(...)
移动的方法中,您调用了repaint(),这将导致组件自行绘制。
另外,摆脱Ball类中的Thread和while循环。
关键是Swing是事件驱动的。 mouseMoved(...)
事件就是动画所需的全部内容。每次拖动鼠标时都会生成一个事件,这将导致您重新绘制Ball。