使用鼠标光标移动对象-Java
我必须使用Java的面向对象编程来完成Agario游戏。到目前为止,我已经画了一个圆,我能够使它跟随我的光标。但是我有很多错误,比如光标碰到球后球没有跟随光标,有时球移动得很快,有时球移动得很慢 总的来说,我认为这还远远不够完美,我想提出一些建议。我只是要让它跟随,我有点挣扎。代码如下: 窗口类:使用鼠标光标移动对象-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
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
formMouseMoved(…)
moved方法中,您调用了repaint(),这将导致组件自行绘制关键是Swing是事件驱动的。
mouseMoved(…)
事件就是动画所需的全部内容。每次拖动鼠标时,将生成一个事件,该事件将导致您重新绘制球 Stackoverflow更适合处理特定问题的问题。您的问题和征求建议的措辞太宽泛了。@k0pernikus我已经在codereview.stackexchange.com上发布了我的问题。谢谢你花时间回答我的问题。关于我的问题,我想不出更好的代码来跟踪我的光标:(@ricardore绝对不是关于代码审查的话题。我们不修复代码。关于球如何不跟随你的光标的问题在这里是有效的!只需更简洁地表述这个问题,并且毫不犹豫地针对不同的问题提出多个问题,即使它们有相似的代码基础。进一步的参考阅读:Unli似乎在神奇宝贝的前几个区域中的每个NPC,在CR我们不是Bug培训师,所以这个问题不适合迁移或x-PostingTanks回答。我将删除线程!每次我使用图形而不重新绘制时,最小化和最大化的应用程序将使绘图消失,我将遵循您的建议手势。谢谢每次我不用重新绘制就使用图形时,最小化和最大化的应用程序都会使绘图消失。我建议您从上的Swing教程中的工作示例开始。它将向您展示一种更好的绘制方法。也就是说,您应该扩展`paintComponent(…),然后将面板添加到框架中。该示例仅在每次单击时更改位置,因此我建议您首先更改示例以更改mouseMove()上的位置。